req.body 未定义多部分

Elo*_*die 0 javascript node.js

我对多部分(表单数据)的 POST 请求有问题。其他主题中的所有想法都不起作用。

  • 我使用快递multer邮递员
  • 我完全删除了正文解析器
  • 上传文件有效,使用密钥访问数据无效。
  • 当我尝试时,console.log(req.body);我获得undefined

这是我的代码:

应用程序.js


    var express = require('express');
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var cors=require('cors');

    //var index = require('./routes/index');
    //var users = require('./routes/users');
    var UsersDB=require('./routes/UsersDB');

    var app = express();

    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');

    // uncomment after placing your favicon in /public
    //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
    app.use(cors());
    app.use(logger('dev'));
    app.use(express.static(path.join(__dirname, 'public')));

    //app.use('/', index);
    //app.use('/users', users);
    app.use('/Users',UsersDB);

    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });

    // error handler
    app.use(function(err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};

      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });


    module.exports = app;


Run Code Online (Sandbox Code Playgroud)

用户数据库.js


    var express = require('express');
    var router = express.Router();
    var Users=require('../models/Users');
    var multer = require('multer');

    var storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, './uploads')
      },
      filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + ".png")
      }
    });

    var upload = multer({ storage: storage }).single('avatar');


    //** POST **  ROUTE : http://localhost:3000/Users/       
    router.post('/',function(req,res,next)
    {
        console.log(req.body.firstName);

    /*
        Users.addUsers(req.body,function(err,count)
        {
            if(err)
            {
                res.json(err);
            }
            else
            {
                res.json(req.body);//or return count for 1 & 0
            }
        });
    */
        upload(req, res, function (err) {
        if (err) {
          // An error occurred when uploading
          return
        }
        // Everything went fine
      })

    });

    module.exports=router;

Run Code Online (Sandbox Code Playgroud)

邮递员错误:


    <!DOCTYPE html>
    <html>
        <head>
            <title></title>
            <link rel="stylesheet" href="/stylesheets/style.css">
        </head>
        <body>
            <h1>Cannot read property 'firstName' of undefined</h1>
            <h2></h2>
            <pre>TypeError: Cannot read property 'firstName' of undefined
        at /mnt/c/Users/Elodie/Desktop/server/routes/UsersDB.js:69:25
        at Layer.handle [as handle_request] (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
        at next (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/route.js:137:13)
        at Route.dispatch (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/route.js:112:3)
        at Layer.handle [as handle_request] (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
        at /mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/index.js:281:22
        at Function.process_params (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/index.js:335:12)
        at next (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/index.js:275:10)
        at Function.handle (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/index.js:174:3)
        at router (/mnt/c/Users/Elodie/Desktop/server/node_modules/express/lib/router/index.js:47:12)</pre>
        </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

pet*_*teb 5

由于您使用 multer 来解析请求正文,因此您需要在访问req.body. 您当前使用 multer 的方式是,它将从请求中提取信息以处理文件,但不会成为中间件堆栈的一部分,因此您在调用路由之前无法从正文解析中受益。

将 multer 中间件添加到路由签名中,这样请求正文将在调用路由回调之前由 multer 解析。例如像这样

router.post('/', upload.single('avatar'), (req, res, next) => {
  console.log(req.body.firstName)
})
Run Code Online (Sandbox Code Playgroud)