У меня есть этот код, который создает 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);
}