#node.js #express #postman #multer
#node.js #экспресс #postman #multer
Вопрос:
У меня есть следующая конфигурация MULTER, установленная в отдельном модуле:
const MIME_TYPE_MAP = {
"image/png": "png",
"image/jpeg": "jpeg",
"image/jpg": "jpg",
};
const fileUpload = multer({
limits: 500000, //in bytes
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "uploads/covers/"); //first argument in cb - always an ERROR
},
filename: (req, file, cb) => {
const extension = MIME_TYPE_MAP[file.mimetype]; // file extension that we want to use
cb(null, Date.now() "." extension);
},
}),
fileFilter: (req, file, cb) => {
const isValid = !!MIME_TYPE_MAP[file.mimetype]; //double exclamation converts UNDEFINED to FALSE
let error = isValid ? null : new Error("Invalid mime type");
cb(error, isValid);
},
});
module.exports = fileUpload;
После этого я реализую экспортированный FileUpload в моем файле маршрута:
const fileUpload = require("../middleware/file-upload");
//POST - create a book
router.post(
"/books",
fileUpload.single("cover"),
bookControllers.createBook
);
ЗАПРОС POST, В КОТОРОМ Я ХОЧУ РЕАЛИЗОВАТЬ ЗАГРУЗКУ ИЗОБРАЖЕНИЙ, ВЫГЛЯДИТ СЛЕДУЮЩИМ ОБРАЗОМ :
//POST - create a book
const createBook = async (req, res, next) => {
const { title, author, isbn, edition, cover } = req.body;
const createdBook = new Book({
title,
author,
isbn,
edition,
// cover:
// "https://cnet4.cbsistatic.com/img/aZRMn1itx4hHpDql5mNX_NTno0M=/940x0/2018/05/01/9acc5e96-f803-4735-9f88-68308fd898cb/fire-and-blood-game-of-thrones-book-cover.jpg",
});
try {
await createdBook.save();
} catch (error) {
error = new HttpError("The book cannot be saved, try again later", 500);
return next(error);
}
res.status(201);
res.json({ book: createdBook.toObject({ getters: true }) });
};
ПОСЛЕ ЗАПУСКА СЕРВЕРА И ТЕСТИРОВАНИЯ REUEST В POSTMAN У МЕНЯ В КОНСОЛИ ПОЯВЛЯЕТСЯ СЛЕДУЮЩАЯ ОШИБКА:
RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: ENOENT
at ServerResponse.writeHead (_http_server.js:241:11)
at ServerResponse._implicitHeader (_http_server.js:232:8)
at write_ (_http_outgoing.js:607:9)
at ServerResponse.end (_http_outgoing.js:717:5)
at ServerResponse.send (I:newReactmain-lrc-projectbackendnode_modulesexpresslibresponse.js:221:10)
at ServerResponse.json (I:newReactmain-lrc-projectbackendnode_modulesexpresslibresponse.js:267:15)
at I:newReactmain-lrc-projectbackendserver.js:28:7
at Layer.handle_error (I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterlayer.js:71:5)
at trim_prefix (I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterindex.js:315:13)
at I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterindex.js:284:7
at Function.process_params (I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterindex.js:335:12)
at next (I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterindex.js:275:10)
at Layer.handle_error (I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterlayer.js:67:12)
at trim_prefix (I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterindex.js:315:13)
at I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterindex.js:284:7
at Function.process_params (I:newReactmain-lrc-projectbackendnode_modulesexpresslibrouterindex.js:335:12)
Пожалуйста, помогите, я потратил целый день, пытаясь решить эту проблему, но ничего не получилось
Ответ №1:
Я думаю, вам следует сначала правильно отправить данные с помощью postman, например, данные изображения (в вашей проблеме cover
), отправленные form-data
на вкладке тела postman.
и установите этот код на server.js
var express = require('express');
var bodyParser = require('body-parser');
var multer = require('multer');
var upload = multer();
var app = express();
в следующий раз используйте это промежуточное программное обеспечение:
// for parsing application/json
app.use(bodyParser.json());
// for parsing application/xwww-
app.use(bodyParser.urlencoded({ extended: true }));
//form-urlencoded
// for parsing multipart/form-data
app.use(upload.array());
app.use(express.static('public'));
и, наконец, обновите этот код и return res.json()
//POST - create a book
const createBook = async (req, res, next) => {
const { title, author, isbn, edition, cover } = req.body;
const createdBook = new Book({
title,
author,
isbn,
edition,
cover
});
try {
await createdBook.save();
} catch (error) {
error = new HttpError("The book cannot be saved, try again later", 500);
return next(error);
}
res.status(201);
reurn res.json({ book: createdBook.toObject({ getters: true }) });
};