Как загрузить файл с развернутого сервера?

#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 ну, может быть, попробовать второй — предпочтительный ИМХО-способ (я отредактировал ответ с примером)