При тестировании запроса POST в POSTMAN загрузка файла на сервер, реализованная с помощью multer, не работает

#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 }) });
};