[英]Can't get POST body from request using Express.js
我正在使用 NodeJS 和 Express(以及更多的东西,如 mongo、sockets 等)开发 API,但我坚持一个非常简单的步骤,我相信。 我只是想从 POST req
对象中获取信息,但是在尝试访问req.body
时出现错误
这是我所拥有的:
var express = require('express'),
http = require('http'),
path = require('path'),
fs = require('fs'),
io = require('socket.io');
dynroute = require('dynroute');
var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(app.router);
app.use(express.bodyParser());
app.post('/user', function(req, res) {
console.log(JSON.stringify(req.body));
res.send(req.body.self);
});
http.createServer(app).listen(app.get('port'), function ()
{
console.log('App Server is now running at:' + app.get('port'));
});
在console.log(JSON.stringify(req.body));
我得到undefined
和res.send(req.body.self);
我收到TypeError: Cannot read property 'self' of undefined
我一直在寻找这种类型的错误,通常问题是人们不包括app.use(express.bodyParser());
中间件,所以我也尝试使用app.use(express.urlencoded());
和app.use(express.json());
,这也不起作用。
如果我执行console.log(req)
我可以看到整个对象,但在从客户端执行 POST 请求时我看不到body
或任何我正在传递的内容(我将它作为 JSON 传递) .
**我知道我可以使用restify
或sails.js
在Node中构建API,但我想自己做所有事情,这样我就可以从经验中学习。*
谢谢
编辑:我不得不把bodyparser
的前中间件app.router
中间件,即定了!
将bodyParser
中间件bodyParser
router
中间件之上!
var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(app.router);
Content-Type = "application/json"
应该是Request Headers
BodyParser 不再与 Express 捆绑在一起
npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
对我来说,@kevinblanco 的注释是“我必须将 bodyparser 中间件放在 app.router 中间件之前,这样才能修复它!” 为我做的。 把它放在一个单独的答案中,因为它埋在底部。
您的代码需要如下所示:
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// My routing here
上面列出的大多数答案都是正确的,但目前 [28-July-2020] 最合适的是使用内置的 express ,即:
app.use(express.json());
这将充当中间件来接受请求中传入的 JSON 对象
在 Golang 中,您可以在对 nodejs express 路由器执行 POST http 客户端请求之前将 Content-Type 设置为 application/json:
//Golang
import (
"bytes"
"encoding/json"
"errors"
"net/http"
)
//method := "POST"
//url := "http://ip:port/api/router"
func request(method string, url string, data interface{}, pHeader map[string]string) {
pBody, err := json.Marshal(data)
if err != nil {
return []byte{}, err
}
request, err = http.NewRequest(method, url, bytes.NewBuffer(pBody))
if(err!=nil ){
return []byte{}, err
}
request.Header.Set("Content-Type", "application/json")
//add header params if any
for key, head := range pHeader {
request.Header.Add(key, head)
}
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
return []byte{}, err
}
defer resp.Body.Close()
}
//NODEJS
//app.js
var express = require('express');
...
var app = express();
app.use(express.json());
var router= require('path/to/router.js');
//use the router
app.use('/api', router);
...
//router.js
router.post('/router', function (req, res, next) {
//log request body to view its values of incoming request
console.log('req.body', req.body)
})
Express 有一个内置的方法可以从来自客户端的 POST 请求中识别 JSON 对象。 您可以在 index.js 文件中使用它,而不是使用 body-parser:
app.use(express.json());
在我的情况下,我必须添加这两行来阅读帖子请求正文
app.use(express.json());
// add this middleware to read post request body
app.use(express.text());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.