我有以下 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;
之后我在我的路由文件中实现了导出的文件上传:
const fileUpload = require("../middleware/file-upload");
//POST - create a book
router.post(
"/books",
fileUpload.single("cover"),
bookControllers.createBook
);
我想要实现图片上传的帖子请求如下所示:
//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 后,我在控制台中出现以下错误:
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:\newReact\main-lrc-project\backend\node_modules\express\lib\response.js:221:10)
at ServerResponse.json (I:\newReact\main-lrc-project\backend\node_modules\express\lib\response.js:267:15)
at I:\newReact\main-lrc-project\backend\server.js:28:7
at Layer.handle_error (I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\index.js:315:13)
at I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\index.js:284:7
at Function.process_params (I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\index.js:335:12)
at next (I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\index.js:275:10)
at Layer.handle_error (I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\layer.js:67:12)
at trim_prefix (I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\index.js:315:13)
at I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\index.js:284:7
at Function.process_params (I:\newReact\main-lrc-project\backend\node_modules\express\lib\router\index.js:335:12)
请帮忙,我花了一整天的时间试图解决这个问题,但没有解决
答案 0 :(得分:0)
我认为您首先应该正确地使用邮递员发送数据,例如图像数据(在您的问题 cover
中)在邮递员的正文选项卡中使用 form-data
发送。
并将此代码设置为 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 }) });
};