загружайте большие файлы и продолжайте загружать в Minio с nodejs, KILLED MY SERVICE? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть API, созданный с NodeJS, в этом API есть процесс, в котором я загружаю большой файл с помощью модуля request-обещания, а затем создается новый буфер, загружаемый в minio. Но у меня проблема в том, что мой API всегда дает сбой, если файл превышает 80-100 МБ и его NodeJS уничтожено на сервере, как его обработать?

Эта функция предназначена для загрузки файла и его преобразования в буфер:

const convertLink = async link => {
  const options = {
    uri: link,
    encoding: null,
    headers: {
      'Content-type': 'application/octet-stream'
    }
  };
  const res = rp.get(options)
    .then((body) => {
      console.log(body)
      const a = new Buffer.from(body);
      return a;
    })
    .catch(err => {
      console.log(err)
      return err;
    });
  return res;
};

это функция для загрузки файлов в Minio из miniosdk:

const streamUpload = async (bucketName, objectName, newBuffer) => {
    try {
        const isUploaded = await minioClient.putObject(bucketName, objectName, newBuffer);
        if (isUploaded) {
            return isUploaded;
        }
    } catch (err) {
        return err;
    }
};

1 Ответ

0 голосов
/ 03 марта 2020

Я думаю, что проблема заключается в том, что вы загружаете файл и сохраняете его в памяти, а затем загружаете его в свой minioClient. что не рекомендуется для больших файлов. Вы должны загрузить этот файл как поток, а затем загрузить его как поток. Хранение больших файлов в памяти может стать причиной уничтожения вашего node.js сервера.

, вы можете попробовать следующий пример, в котором я использую библиотеку request npm, загружаю файл и сохраняю его как поток во временную папку, а затем чтение файла из этой временной папки и загрузка по другому URL: -

Загрузка файла: -

const downloadFile = async (url) => {
    try {

        let tempLocation = "./temp/";
        let fileName="myfile";
        return new Promise((resolve, reject) => {
            request
                .get(url)
                .on('response', function (response) {
                     console.log(response.statusCode) // 200
                     console.log(response.headers['content-type']) 
                })
                .on('error', function (error) {
                    console.log('downloading error', error)
                    reject()
                })
                .on('end', async function () {
                    console.log("donwload finished")
                    resolve();
                })
                .pipe(fs.createWriteStream(tempLocation + '/' + fileName))
        });

    } catch (error) {
        console.log("error in downloadFile", error)
        throw error;
    }
}

теперь вы можете загрузить файл для вашего minioClient в виде потока. вы можете использовать fs.createReadStream(file) для чтения файла как потока данных из этого временного местоположения.

...