Использование Multer для обработки формданных - PullRequest
0 голосов
/ 14 мая 2018

У меня есть этот код, который создает project и загружает изображение в Amazon S3.

Я использую промежуточное программное обеспечение Bodyparser для обработки данных, поступающих от клиента, но после некоторых исследований я обнаружил, что оно не обрабатывает formdata. Мне нужно использовать multer или подобную библиотеку.

Вот моя попытка использовать multer:

В моей папке маршрутов, которая обрабатывает запрос Post к функции Create, я добавил ее так:

import multer from 'multer';
const upload = multer(); 
routes.post(
  '/',
  upload.any('projectImage'),
  ProjectController.create,
);

Вот функция Create:

export async function create(req, res, next) {
  const body = req.body;
  S3Upload(req, res, async (s3err, s3res) => {
    if (s3err) {
      res.send('Error occured uploading image')
    } else if (s3res && s3res.Location) {
      body.projectImage = s3res.Location
      try {
        return res
          .status(HTTPStatus.CREATED)
          .json(await Project.createProject(body, req.user._id));
      } catch (err) {
        err.status = HTTPStatus.BAD_REQUEST;
        return next(err);
      }
    } else {
      res.send('Error creating project.')
    }
  });
}

Теперь, когда я отправляю почтовый запрос на маршруты /project. Я получаю эту ошибку:

(node:77236) UnhandledPromiseRejectionWarning: TypeError: (0 , _s2.default) is not a function

(node:77236) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

PS. Функция Create отлично работает без добавления S3Upload. & S3Upload также отлично работает, если я только отправляю файл. Единственный раз, когда это не работает, это когда я отправляю данные микса. то есть форма с некоторыми текстовыми полями и файлом.

Я не публиковал функцию S3Upload, но если кому-то интересно, дайте мне знать, я поделюсь кодом для него.

UPDATE

export async function S3Upload(req, res, callback) {

  const chunks = [];
  let fileType;
  let fileEncodingType;

  const busboy = new Busboy({
    headers: req.headers,
  });

  busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
    filename.replace(/ /g, "_");
    fileType = mimetype;
    fileEncodingType = encoding;
    file.on('data', data => {
      chunks.push(data)
    });
    file.on('end', () => {
      console.log(`File [${filename}] Finished`);
    });
  });
  busboy.on('finish', () => {
    const userId = UUID();
    const params = {
      Bucket: BUCKET_NAME,
      Key: userId,
      Body: Buffer.concat(chunks),
      ACL: ACL,
      ContentEncoding: fileEncodingType,
      ContentType: fileType
    }
    S3.upload(params, (err, s3res) => {
      if (err) {
        callback(err);
      } else {
        callback(null, s3res);
      }
    });
  });
  req.pipe(busboy);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...