Javascript 请求正文正在返回“;“未定义”;价值观

Javascript 请求正文正在返回“;“未定义”;价值观,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我已经在我的应用程序app.js文件中添加了body解析器。我有一个routes文件夹和一个controllers文件夹来处理我的请求 最初,我没有将主体解析器添加到我的应用程序中。当我添加body解析器并记录控制台req.body时,我得到了一个空对象。当我控制台记录req.body.email,req.body.password和req.body.displayName时,来自postman的值被读取为未定义 app.js let createError = require('http-er

我已经在我的应用程序
app.js
文件中添加了
body解析器。我有一个
routes
文件夹和一个
controllers
文件夹来处理我的请求

最初,我没有将
主体解析器添加到我的应用程序中。当我添加
body解析器
并记录控制台
req.body
时,我得到了一个空对象。当我控制台记录
req.body.email
req.body.password
req.body.displayName
时,来自
postman
的值被读取为未定义

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

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

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

请确保您正在postman
content-type:application/json
中添加content-type标题,同时在body选项卡中选择raw,并在raw旁边从下拉列表中选择json。 检查这个


您可能正在尝试使用邮递员发送表单数据,邮递员发送多部分正文,正文解析器无法处理多部分正文。对于处理多部分实体,您必须使用不同的模块,我通常使用

安装了multer后,您只需使用none()将它和它作为中间件(例如,在body parser下)包括在内,因为在这种情况下,您希望只处理文本多部分正文(有关这方面的详细信息,请参阅

除此之外,我想提到的是,您的代码中包含了两个主体解析器,express主体解析器

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
和外部主体解析器

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

选择一个,两个都不需要,对我来说最好的选择是保留express附带的一个,这样你就不必再安装任何外部软件包。

尝试将app.use(bodyParser.urlcoded({extended:false}));更改为true。然后删除这些:app.use(express.json());app.use(express.urlcoded({extended:false}));如果您请求此路由时未将
内容类型
标题设置为
应用程序/json
,则可能会发生这种情况,这可能就是问题所在?
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));