在POSTMAN中测试POST请求时,文件上传到服务器,用multer实现,不起作用

时间:2021-01-10 13:44:18

标签: node.js express 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; 

之后我在我的路由文件中实现了导出的文件上传:

 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)

请帮忙,我花了一整天的时间试图解决这个问题,但没有解决

1 个答案:

答案 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 }) });
};
相关问题