Req.Body返回“未定义”值

时间:2019-08-25 15:42:52

标签: javascript node.js mongodb express

我已将body-parser添加到我的应用程序app.js文件中。我有一个routes文件夹和一个处理我的请求的controllers文件夹。

最初,我没有将body-parser添加到我的应用程序中。当我添加body-parser并在控制台登录req.body时,我得到了一个空对象。当我用控制台登录时,来自req.body.email的{​​{1}},req.body.passwordreq.body.displayName值被读为未定义。

app.js

postman

routes / user.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;

controllers / 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;

2 个答案:

答案 0 :(得分:2)

请确保您要在邮递员content-type : application/json中添加内容类型标头,同时在“正文”标签中选择“原始”,然后在“原始”旁边从下拉列表中选择json。 选中

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

答案 1 :(得分:1)

您可能正在尝试使用Postman发送表单数据,而Postman发送了multipar正文,body解析器无法处理多部分正文。要处理多部分实体,您必须使用其他模块,我通常使用multer

安装了multer后,您只需要使用none()将其包含在中间件中(例如,在您的body-parser下),因为在这种情况下,您要处理纯文本的多部分主体({{ 3}}

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

除了我想提起您的代码之外,您的代码中还包括两个主体解析器,即主体解析器

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

和外部人体分析器

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

选择一个,不需要两个,对我来说最好的选择是保留Express附带的一个,这样就不必安装其他外部软件包。