繁体   English   中英

节点 JS req.body 未定义

[英]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等于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 种不同的路由回调签名

  • (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM