#javascript #node.js #typescript
#javascript #node.js #typescript
Вопрос:
Может кто-нибудь сказать мне, почему функция ниже правильно загружает мой файл с сервера, когда я работаю локально (по localhost), но не загружает меня и возвращает мне 500 internal server error
, когда я пытаюсь сделать это, когда я развертываю свое приложение на удаленном сервере?
async downloadFile(fileId: number): Promise<Buffer> {
const fileName = await this.getFileName(fileId);
const fileBuffer = await new Promise<Buffer>((resolve, reject) => {
fs.readFile(process.cwd() '/files/' fileName '.xlsx', {}, (err, data) => {
if (err) reject(err)
else resolve(data)
});
});
return fileBuffer ;
}
спасибо за любую помощь
РЕДАКТИРОВАТЬ, ОШИБКА ИЗ ЖУРНАЛА:
ENOENT: no such file or directory
Комментарии:
1. Коды ошибок HTTP предоставляют мало информации. Проверьте свои журналы ошибок. Что такое внутренняя ошибка сервера?
2. Неправильный ответ, но вы должны использовать читаемый поток; не считывайте файл hole в память
3. @MarkBaijens я добавляю ошибку из журналов внизу
4. Эта ошибка довольно понятна, верно? Путь к файлу не ведет к существующему файлу.
5. @ertyjdjgdfgj — вы проверили, что файл находится на удаленном сервере?
Ответ №1:
Если вы хотите получить доступ к своему файлу относительно каталога вашего скрипта, вы должны использовать __dirname
Также хорошей практикой является использование модуля path для определения местоположения файла независимо от платформы.
const path = require('path')
const filePath = path.join(__dirname, 'files', `${fileName}.xlsx`)
process.cwd()
ссылается на ваш рабочий каталог процесса узла. Использование его в вашем контексте привязало бы ваш код к тому, как была вызвана точка входа. Это плохо. Код не должен знать о своем контексте выполнения, чтобы работать, когда это возможно.
Еще лучшим способом было бы настроить местоположение вашего файла (используя переменную среды или конфигурационный файл) и таким образом передать значение папки загрузки в ваш код.
смотрите https://12factor.net/config
пример
const baseDir = process.env.FILES_PATH || '/some/default/location';
const filePath = path.join(baseDir, 'files', `${fileName}.xlsx`);
затем запустите свою программу с
FILES_PATH=/your/directory node your_script.js
Комментарии:
1. моя
files
папка должна находиться в том же каталоге, что и мой класс, когда выполняется эта функция?2. @ertyjdjgdfgj добавил редактирование с другим способом обработки вещей
3. хорошо, но прямо сейчас я сохраняю свой файл в каталоге, но хочу получить свой файл из каталога, почему?
src/.../files
__dirname
dist/.../files
и почему у меня нет моейfiles
папки в dist?4. я еще не развернул свой проект, я пытаюсь использовать это локально и возвращаю мне, что у меня нет файла или каталога в моей папке dist
5. @ertyjdjgdfgj ну, может быть, попробовать второй — предпочтительный ИМХО-способ (я отредактировал ответ с примером)