Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.js和Express发布时如何访问请求正文?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 使用Node.js和Express发布时如何访问请求正文?

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(); }); 现在,如果我发布如下内

我有以下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
我如期得到了某人。现在,如果我想得到完整的请求主体呢?我尝试了
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 }));