Javascript 使用Node.js和Express发布时如何访问请求正文?
我有以下Node.js代码:Javascript 使用Node.js和Express发布时如何访问请求正文?,javascript,node.js,express,Javascript,Node.js,Express,我有以下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(); }); 现在,如果我发布如下内
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
我如期得到了某人。现在,如果我想得到完整的请求主体呢?我尝试了response.write(request.body)
但Node.js抛出一个异常,说“第一个参数必须是字符串或缓冲区”,然后进入一个“无限循环”,异常是“发送后不能设置头”;即使我做了var reqBody=request.body,这也是正确的代码>然后写入响应。写入(reqBody)
这里有什么问题
另外,我是否可以在不使用express.bodyParser()
的情况下获取原始请求?您所声称的“尝试过的”正是您在代码中编写的,当您使用curl调用它时,它可以“如预期”工作
您收到的错误似乎与您向我们显示的任何代码都不相关
如果要获取原始请求,请为数据
和结束
事件设置请求
上的处理程序(当然,还要删除对express.bodyParser()的任何调用)。请注意,数据
事件将以块的形式出现,除非为数据
事件设置编码,否则这些块将是缓冲区,而不是字符串。Express 4.0及更高版本:
$npm安装--保存正文解析器
然后在节点应用程序中:
const bodyParser = require('body-parser');
app.use(bodyParser);
Express 3.0及以下版本:
尝试在cURL调用中传递此消息:
--标题“内容类型:应用程序/json”
并确保您的数据采用JSON格式:
{“用户”:“某人”}
此外,您可以在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);
另一个问题也可能有帮助:
如果不想使用bodyParser,请检查另一个问题:试试这个:
response.write(JSON.stringify(request.body));
这将获取bodyParser
为您创建的对象,并将其转换回字符串并将其写入响应。如果您想要确切的请求正文(使用相同的空格等),则需要在请求之前附加数据和结束侦听器,并按块构建字符串,如您在中所见。从Express4开始,下面的代码似乎可以实现此目的。
请注意,您需要使用npm
安装body parser
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
});
您可以使用以下代码记录post数据:
router.post("/users",function(req,res){
res.send(JSON.stringify(req.body, null, 4));
});
这对你有帮助。我假设您发送的是json格式的正文。从express v4.16开始,不需要任何额外的模块,只需使用内置的:
像这样:
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
})
const express=require('express'))
app.use(express.json())//{
res.json({requestBody:req.body})/这可以在没有主体解析器
依赖关系的情况下实现,监听request:data
和request:end
并在请求结束时返回响应,请参阅下面的代码示例。参考:
如果你懒得阅读大量的post数据。
您可以简单地粘贴到下面的行
阅读json
下面是TypeScript的例子,类似的例子也可以用于JS
应用程序ts
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 }));
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");
}
};
在您的任何一个控制器中,接收呼叫后使用,如下所示
userController.ts
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 }));
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");
}
};
公共异步姿势(\u-req:Request,\u-res:Response){
试一试{
const onRecord=_req.body;
/*您的业务逻辑*/
_res.status(201).发送(“用户创建”);
}
否则{
_res.status(500).send(“服务器错误”);
}
};
_req.body应该将json数据解析到TS模型中
2019年,您不需要安装主体解析器
您可以使用:
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
});
我对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 }));
就我而言,我没有设置标题:
“内容类型:应用程序/json”
您不应该使用正文解析器,因为它已被弃用。请尝试此方法
const express=require('express'))
const app=express()
app.use(express.json())//注意express.json中间件
这是一个复制粘贴错误;我指的是request.body
而不是request.body.user
,我现在已经更正了。顺便说一句,var reqBody=request.body;
过去和现在都是正确的,当你尝试它时,你会得到我得到的错误。无论如何,你能举一个关于se的例子吗在request
上调试处理程序;我似乎在express guide中找不到它。它似乎与响应有关。write(reqBody)
;当我使用响应时。send(reqBody)
一切正常……是的,我在响应之后使用response.end
。write
。我尝试使用curl-d{“user”:“Someone”}-H“内容类型:应用程序/json”--urlhttp://localhost:5000
但它给了我错误“意外令牌u”,这就是为什么我在我的原始帖子中切换到提到的调用。我之所以将此标记为应答,是因为链接express.bodyParser()
在express 4.x中被弃用。请改用。@TheBlueSky您得到的原因是什么“意外标记u”是因为shell使用了你的双引号。如果你回送任何“东西”
,也会发生同样的情况。你发布的数据应该在引号内,以防止这种情况发生。从express 4.16.0或更高版本开始,可以在app.use()中使用express.json(),方法是=>app.use(express.json());对于解析json主体,需要添加以下行app.use(bodyParser.json())
@cml.co是否有任何原因app.use(bodyParser.urlencoded({extended:true})
?我在
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 }));