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
等于req
, req
等于res
, res
等于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
,因为bodyParser
在app
:
const app = express(); const bodyParser = require('body-parser');
然后在下面有这几行:
app.use(bodyParser.json()) app.use(bodyParser.urlencoded({extended: true}))