[英]Node JS req.body undefined
我浏览了很多其他帖子,对此我感到非常迷茫。
我可以运行console.log(req)
并获得以下 output
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' }
......但是不,变得未定义
经过研究,我发现这可能与我的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
添加配置 function
您的问题是 Express 不为其路由处理程序使用错误优先回调。 下面的代码不起作用,因为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 种不同的路由回调签名
(req, res) => {}
- 这是最基本的,定义了只关心请求和响应的路由(req, res, next) => {}
- 这是中间件回调签名,看起来像一个基本的路由回调,但它还分配了next
object,它告诉 Express 调用下一个匹配的路由。(err, req, res, next) => {}
- 这是错误处理路由回调,每个 Express Router Middleware 或 Express App 只需要 1 个。 如果在路由或中间件中调用next(err)
,它就会被调用。 更具体地说,如果next()
没有使用 string 或什么都不调用,它将跳过所有剩余的中间件和路由以及 go 直接到错误处理程序。 您可以在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
,因为在app
中使用了bodyParser
:
const app = express(); const bodyParser = require('body-parser');
然后在下面有这些行:
app.use(bodyParser.json()) app.use(bodyParser.urlencoded({extended: true}))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.