简体   繁体   English

Req.Body返回“未定义”值

[英]Req.Body is returning “undefined” values

I have added body-parser to my application app.js file. 我已将body-parser添加到我的应用程序app.js文件中。 I have a routes folder and a controllers folder which handles my request. 我有一个routes文件夹和一个处理我的请求的controllers文件夹。

Initially, I did not have body-parser added to my application. 最初,我没有在我的应用程序中添加body-parser When I added body-parser and console logged req.body I got an empty object. 当我添加了body-parser和控制台记录的req.body我得到了一个空对象。 When I console logged req.body.email , req.body.password , and req.body.displayName values from postman were read as undefined. 当我安慰登录req.body.emailreq.body.passwordreq.body.displayName从值postman被理解为未定义。

app.js app.js

let createError = require('http-errors');
let express = require('express');
let path = require('path');
let cookieParser = require('cookie-parser');
let logger = require('morgan');
let bodyParser = require('body-parser');
let assert = require('assert');

if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config()
}

let usersRouter = require('./routes/user');

let app = express();

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

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use('/user', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// 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');
});

// MongoDB Connection
const db = {};
const MongoClient = require('mongodb').MongoClient;

MongoClient.connect(process.env.MONGODB_CONNECT_URL, (err, client) => {
  // Connection works dont worry about it
});

module.exports = app;

routes/user.js 路线/ user.js的

const express = require('express');
const router = express.Router();
const user = require('../controllers/user');

router.post('/', user.createUser);
router.delete('/:id', user.deleteUser);
router.get('/:id', user.loginUser);

module.exports = router;

controllers/user.js 控制器/ user.js的

const bcrypt = require('bcryptjs');
const Joi = require('joi');
const ObjectId = require('mongodb').ObjectID;

exports.createUser = async (req, res, next) => {
    console.log('Request body: ', req.body);
    const email = req.body.email;
    const password = req.body.password;
    const displayName = req.body.displayName;

    console.log('Email: ', email);
    console.log('Password: ', password);
    console.log('Display name: ', displayName);
};

Please make sure that you are adding content-type header in postman content-type : application/json also in body tab select raw and beside raw select json from drop-down list. 请确保您在邮递员content-type : application/json类型中添加内容类型标题content-type : application/json也在body选项卡中选择raw并从下拉列表中选择raw select json旁边。 Check this 检查一下

https://i.stack.imgur.com/ZDhcl.png https://i.stack.imgur.com/ZDhcl.png

You are probably trying to send form-data with Postman which sends a multipar body, body parser cannot handle multipart bodies. 您可能正在尝试使用Postman发送表单数据,该表单发送一个多重体,体解析器无法处理多部分体。 For handling multipart bodies you have to use a different module, I normally use multer . 为了处理多部分体,你必须使用不同的模块,我通常使用multer

With multer installed you just have to include it and it as middleware (under you body-parser for instance) using none() since in this case you want to handle text-only multipart body (More information about this in multer docs 安装multer后,你只需要使用none()作为中间件(在你的body-parser下),因为在这种情况下你想要处理纯文本的多部分体(在multer docs中有关于此的更多信息)

let multer = require('multer');
app.use(multer().none());

Besides that I wanted to mention you are including two body parsers in your code, the express body parser 除此之外,我想提一下你在代码中包含了两个正文解析器,即快速体解析器

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

and an external body-parser 和一个外部身体解析器

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

Pick one, you don't need both, the best option for me would be to keep the one that comes with express, this way you don't have to install any more external packages. 选择一个,你不需要两个,对我来说最好的选择是保留快递附带的那个,这样你就不必再安装任何外部包了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM