我有以下Node.js代码:
var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());
app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});
现在,如果我发布类似的内容:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
我得到Someone
了预期的结果。现在,如果我想获得完整的请求正文怎么办?我尝试这样做,response.write(request.body)
但是Node.js抛出一个异常,说“第一个参数必须是字符串或Buffer ”,然后转到“无限循环”,并出现异常,指出“发送标头后不能设置标头”。即使我var reqBody = request.body;
再写了也是这样response.write(reqBody)
。
这里有什么问题?
另外,我可以不使用而仅获取原始请求express.bodyParser()
吗?
Express 4.0及更高版本:
$ npm install --save body-parser
然后在您的节点应用程序中:
const bodyParser = require('body-parser');
app.use(bodyParser);
Express 3.0及以下版本:
尝试在您的cURL调用中传递此代码:
--header "Content-Type: application/json"
并确保您的数据采用JSON格式:
{"user":"someone"}
另外,您可以在node.js代码中使用console.dir来查看对象中的数据,如以下示例所示:
var express = require('express');
var app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
console.dir(req.body);
res.send("test");
});
app.listen(3000);
这个其他问题可能也有帮助:如何在快速的node.js POST请求中接收JSON?
如果您不想使用bodyParser,请查看其他问题:https ://stackoverflow.com/a/9920700/446681
从express v4.16开始,不需要任何其他模块,只需使用内置的JSON中间件即可:
app.use(express.json())
像这样:
const express = require('express')
app.use(express.json()) // <==== parse request body as JSON
app.listen(8080)
app.post('/test', (req, res) => {
res.json({requestBody: req.body}) // <==== req.body will be a parsed JSON object
})
注意-body-parser
依赖于此-已包含在express中。
也不要忘记发送标题 Content-Type: application/json
从Express 4开始,以下代码似乎可以解决问题。请注意,您需要body-parser
使用安装npm
。
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.listen(8888);
app.post('/update', function(req, res) {
console.log(req.body); // the posted data
});
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())
var port = 9000;
app.post('/post/data', function(req, res) {
console.log('receiving data...');
console.log('body is ',req.body);
res.send(req.body);
});
// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);
这将为您提供帮助。我假设您正在使用json发送正文。
对于2019,您不需要安装body-parser
。
您可以使用:
var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
console.log(req.body); // the posted data
});
此,可以实现无body-parser
依赖关系,以及,听取request:data
和request:end
,并返回对请求端的响应时,参考下面的代码示例。参考:https : //nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body
var express = require('express');
var app = express.createServer(express.logger());
app.post('/', function(request, response) {
// push the data to body
var body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
// on end of data, perform necessary action
body = Buffer.concat(body).toString();
response.write(request.body.user);
response.end();
});
});
尝试这个:
response.write(JSON.stringify(request.body));
这将采用bodyParser
为您创建的对象,然后将其转换为字符串并将其写入响应。如果您想要确切的请求正文(具有相同的空格等),则需要在请求之前附加data
和end
侦听器,并逐块构建字符串,如在connect中从json解析源代码中看到的那样。
您声称已“尝试执行”的操作正是您在使用curl调用时按“预期”工作的代码中编写的内容。
您收到的错误似乎与您显示给我们的任何代码都不相关。
如果要获取原始请求,请request
为data
和end
事件设置处理程序为开(当然,还要删除的所有调用express.bodyParser()
)。请注意,data
事件将以块的形式发生,并且除非您为data
事件设置编码,否则这些块将是缓冲区而不是字符串。
如果您足够懒惰以读取大块的发布数据。您可以简单地将以下行粘贴以读取json。
以下是针对TypeScript的代码,也可以对JS进行类似操作。
应用程序
import bodyParser from "body-parser";
// support application/json type post data
this.app.use(bodyParser.json());
// support application/x-www-form-urlencoded post data
this.app.use(bodyParser.urlencoded({ extended: false }));
在收到POST呼叫的任何控制器之一中,如下所示
userController.ts
public async POSTUser(_req: Request, _res: Response) {
try {
const onRecord = <UserModel>_req.body;
/* Your business logic */
_res.status(201).send("User Created");
}
else{
_res.status(500).send("Server error");
}
};
_req.body应该将json数据解析为TS模型。
我绝对不是JS和ES的新手,但是对我来说似乎起作用的是:
JSON.stringify(req.body)
让我知道它有什么问题!
通过以下命令安装Body Parser
$ npm install --save body-parser
配置正文解析器
const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));
就我而言,我缺少设置标头:
"Content-Type: application/json"
您使用以下代码来记录发布数据:
router.post("/users",function(req,res){
res.send(JSON.stringify(req.body, null, 4));
});
文章标签:express , javascript , node.js
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!