Node JS req.body未定义

我已经看了不less其他职位,我很迷茫。

我可以运行一个console.log(req)并获得以下输出

 ServerResponse { ... req: IncomingMessage { ... url: '/my-endpoint', method: 'POST', statusCode: null, statusMessage: null, ... body: { foo: 'bar' }, _body: true, ... route: Route { path: '/my-endpoint', stack: [Object], methods: [Object] } }, ... 

看起来很稳定,所以我希望做console.log(req.body)并获得{ foo: 'bar' }回到控制台中…但是不行,得到undefined

经过研究,我发现它可能是我的app.js文件,特别是与一个body-parser ,但是,我已经所有的

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var http = require('http'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); //Home Page Rendering var index = require('./routes/index'); app.use('/', index); // All other routes are kept in the `routes` module require('./routes')(app); module.exports = app; 

routes.js

 module.exports = function routing(app) { var apiClient = require('./services/apiClient'); app.post('/get-device-info', function(err, req, res){ console.log("/get-device-info routes"); apiClient(req, res); }); }; 

apiClient.js

 module.exports = function callApi(req, res){ console.log(req); console.log(req.body) }; 

index.js

 var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router; 

这是我试过的

app.use(express.bodyParser());

确保传入的请求显式声明application / json

以其他方式声明body parser.json

添加一个configurationfunction

您的问题是,Express不使用错误第一个callback路由处理程序。 下面的代码不会工作,因为app.post处理程序没有签名(req, res) => {} 。 在下面的代码中, err等于reqreq等于resres等于next

 // routes.js module.exports = function routing(app) { var apiClient = require('./services/apiClient'); app.post('/get-device-info', function(err, req, res){ console.log("/get-device-info routes"); // Assuming the request is correct // the value of body will be the request body console.log(res.body) apiClient(req, res); }); };` 

您可以在Express中使用3种不同的路由callback签名

  • (req, res) => {} – 这是最基本的,它定义了一个只关心请求和响应的路由
  • (req, res, next) => {} – 这是中间件callback签名,看起来像一个基本的路由callback,但它也分配next对象,告诉Express调用下一个匹配的路由。
  • (err, req, res, next) => {} – 这是error handling路由callback,每个Express Router Middleware或Express App只需要1个。 如果在路由或中间件内调用next(err)它会被调用。 更具体地说,如果next()不是用一个string或什么都不调用,它会跳过所有剩下的Middleware和Routes,直接进入error handling程序。 您可以在Express Docs中阅读更多关于它的信息

您需要将路线定义更改为

 app.post('/get-device-info', (req, res) => { apiClient(req, res) }) 

或者你甚至可以这样做

 module.exports = app => { let apiClient = require('./services/apiClient') app.post('/get-device-info', apiClient) } 

试试这个,因为它为我工作。

首先声明app ,然后bodyParser ,因为bodyParserapp

 const app = express(); const bodyParser = require('body-parser'); 

然后在下面有这几行:

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