快递+邮递员,req.body为空
Express + Postman, req.body is empty
我知道这个问题已经被问过很多次了,但我一直在四处寻找,仍然找不到我的问题的答案。
这是我的代码,我确保在定义路由之前使用和配置主体解析器。我只将 .json() 与 bodyParser 一起使用,因为现在我只测试 POST 函数,但我什至尝试过 app.use(bodyParser.urlencoded( { 扩展:真 }));
var express = require('express'),
bodyParser = require('body-parser'),
app = express();
app.use(bodyParser.json());
app.set('port', (process.env.PORT || 5000));
app.listen(app.get('port'), function() {
console.log("Node app is running at localhost:" + app.get('port'))
});
app.post('/itemSearch', function(req, res) {
//var Keywords = req.body.Keywords;
console.log("Yoooooo");
console.log(req.headers);
console.log(req.body);
res.status(200).send("yay");
});
以下是我如何使用 Postman 测试这条路由。
这是我收到的回复
Node app is running at localhost:5000
Yoooooo
{ host: 'localhost:5000',
connection: 'keep-alive',
'content-length': '146',
'cache-control': 'no-cache',
origin: 'chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop',
'content-type': 'multipart/form-data; boundary=----WebKitFormBoundarynJtRFnukjOQDaHgU',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'postman-token': '984b101b-7780-5d6e-5a24-ad2c89b492fc',
accept: '*/*',
'accept-encoding': 'gzip, deflate',
'accept-language': 'en-GB,en-US;q=0.8,en;q=0.6' }
{}
在这一点上,我将非常感谢任何帮助。谢谢
据我所知,您需要使用 Body-Parser:https://github.com/expressjs/body-parser
bodyParser = require('body-parser').json();
app.post('/itemSearch', bodyParser, function(req, res) {
//var Keywords = req.body.Keywords;
console.log("Yoooooo");
console.log(req.headers);
console.log(req.body);
res.status(200).send("yay");
});
然后尝试使用 PostMan 将正文设置为 raw
json:
{
"test": "yay"
}
花了几个小时后,我意识到需要将 postman 中的原始类型更改为 JSON
在我的例子中,我通过将 "type":"text"
添加到 urlencoded
项目来解决它,这是邮递员生成的导出集合 json
文件中的。我观察它是因为我的一些请求已成功完成。不同之处在于 json 生成的邮递员集合文件中缺少 type
字段。这个问题也发生在我的队友身上。
之前(请求失败):
"body": {
"mode": "urlencoded",
"urlencoded": [
{
"key": "email",
"value": "{{userEmail}}"
},
{
"key": "password",
"value": "{{userPassword}}"
}
]
}
之后(请求成功):
"body": {
"mode": "urlencoded",
"urlencoded": [
{
"key": "email",
"value": "{{userEmail}}",
"type": "text"
},
{
"key": "password",
"value": "{{userPassword}}",
"type": "text"
}
]
}
我还用 javascript 语言编写解析器脚本来处理它。
const fs = require('fs');
let object = require(process.argv[2]);
function parse(obj) {
if(typeof obj === 'string') return;
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
if(key === 'urlencoded') {
let body = obj[key];
for(let i = 0;i < body.length;i++) {
body[i].type = "text";
}
}
else parse(obj[key]);
}
}
}
parse(object);
fs.writeFile('ParsedCollection.json', JSON.stringify(object, null, '\t'), function(err){
//console.log(err);
});
只需在终端node parser.js <json postman collection file path>
中运行它,它就会输出到ParsedCollection.json
文件中。之后将此文件导入邮递员。
试试这个
// create application/json parser
app.use(bodyParser.json());
// parse various different custom JSON types as JSON
app.use(bodyParser.json({ type: 'application/*+json' }));
// parse some custom thing into a Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }));
// parse an HTML body into a string
app.use(bodyParser.text({ type: 'text/html' }));
// parse an text body into a string
app.use(bodyParser.text({ type: 'text/plain' }));
// create application/x-www-form-urlencoded parser
app.use(bodyParser.urlencoded({ extended: false }));
我想添加一个答案,因为发送为 form-data
似乎有问题,即使我将 Content-Type: multipart/form-data
添加到 Header(已列出正确 header 键入文档)。我想知道是否因为在 express 中使用 BodyParser,所以数据必须以 JSON 原始形式输入。我发誓我以前 form-data
工作过,唉。
以下是我如何让 req.body
不为空:
- 确保在“Headers”选项卡中,您设置了这个键值对:
Content-Type: application/json
旁注:关于 all available header content type values 上的堆栈溢出文章很有趣 link。
- 在“Body”选项卡中,确保选择了
raw
单选按钮,并且最右侧的下拉菜单选择了 JSON
:
- 现在,如果我在我的 Express 应用程序中控制日志
req.body
,我会看到打印的内容:
花了 2 天和几个小时后,我意识到我需要更改 postman : Text to JSON
如果您使用的是 express 16.4 及更高版本,
确保你有:
const express = require("express");
require("dotenv").config({ path: "./config/.env" });
require("./config/db");
const app = express();
const userRoutes = require("./routes/user.routes");
app.use(express.json()); //this is the build in express body-parser
app.use( //this mean we don't need to use body-parser anymore
express.urlencoded({
extended: true,
})
);
//routes
app.use("/api/user", userRoutes);
// connect to the server
app.listen(process.env.PORT, () => {
console.log(`lestening port ${process.env.PORT}`);
});
由于您将请求作为表单数据发送,因此请使用 express
或 body-parser
.
中的 urlencoded() 中间件
bodyParser = require('body-parser').urlencoded({ extended: true });
app.post('/itemSearch', bodyParser, function(req, res) {
//var Keywords = req.body.Keywords;
console.log("Yoooooo");
console.log(req.headers);
console.log(req.body);
res.status(200).send("yay");
});
您好,您不需要正文解析器
const StringDecoder = require("string_decoder").StringDecoder;
_server.post("/users", function (req, res) {
const decoder = new StringDecoder();
let buffer = "";
req.on("data", function (data) {
buffer += decoder.write(data);
});
req.on("end", function () {
try {
console.log(JSON.parse(buffer));
res.json({ success: "ok });
} catch (e) {
console.log(e);
}
});
});
我知道这个问题已经被问过很多次了,但我一直在四处寻找,仍然找不到我的问题的答案。
这是我的代码,我确保在定义路由之前使用和配置主体解析器。我只将 .json() 与 bodyParser 一起使用,因为现在我只测试 POST 函数,但我什至尝试过 app.use(bodyParser.urlencoded( { 扩展:真 }));
var express = require('express'),
bodyParser = require('body-parser'),
app = express();
app.use(bodyParser.json());
app.set('port', (process.env.PORT || 5000));
app.listen(app.get('port'), function() {
console.log("Node app is running at localhost:" + app.get('port'))
});
app.post('/itemSearch', function(req, res) {
//var Keywords = req.body.Keywords;
console.log("Yoooooo");
console.log(req.headers);
console.log(req.body);
res.status(200).send("yay");
});
以下是我如何使用 Postman 测试这条路由。
这是我收到的回复
Node app is running at localhost:5000
Yoooooo
{ host: 'localhost:5000',
connection: 'keep-alive',
'content-length': '146',
'cache-control': 'no-cache',
origin: 'chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop',
'content-type': 'multipart/form-data; boundary=----WebKitFormBoundarynJtRFnukjOQDaHgU',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'postman-token': '984b101b-7780-5d6e-5a24-ad2c89b492fc',
accept: '*/*',
'accept-encoding': 'gzip, deflate',
'accept-language': 'en-GB,en-US;q=0.8,en;q=0.6' }
{}
在这一点上,我将非常感谢任何帮助。谢谢
据我所知,您需要使用 Body-Parser:https://github.com/expressjs/body-parser
bodyParser = require('body-parser').json();
app.post('/itemSearch', bodyParser, function(req, res) {
//var Keywords = req.body.Keywords;
console.log("Yoooooo");
console.log(req.headers);
console.log(req.body);
res.status(200).send("yay");
});
然后尝试使用 PostMan 将正文设置为 raw
json:
{
"test": "yay"
}
花了几个小时后,我意识到需要将 postman 中的原始类型更改为 JSON
在我的例子中,我通过将 "type":"text"
添加到 urlencoded
项目来解决它,这是邮递员生成的导出集合 json
文件中的。我观察它是因为我的一些请求已成功完成。不同之处在于 json 生成的邮递员集合文件中缺少 type
字段。这个问题也发生在我的队友身上。
之前(请求失败):
"body": {
"mode": "urlencoded",
"urlencoded": [
{
"key": "email",
"value": "{{userEmail}}"
},
{
"key": "password",
"value": "{{userPassword}}"
}
]
}
之后(请求成功):
"body": {
"mode": "urlencoded",
"urlencoded": [
{
"key": "email",
"value": "{{userEmail}}",
"type": "text"
},
{
"key": "password",
"value": "{{userPassword}}",
"type": "text"
}
]
}
我还用 javascript 语言编写解析器脚本来处理它。
const fs = require('fs');
let object = require(process.argv[2]);
function parse(obj) {
if(typeof obj === 'string') return;
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
if(key === 'urlencoded') {
let body = obj[key];
for(let i = 0;i < body.length;i++) {
body[i].type = "text";
}
}
else parse(obj[key]);
}
}
}
parse(object);
fs.writeFile('ParsedCollection.json', JSON.stringify(object, null, '\t'), function(err){
//console.log(err);
});
只需在终端node parser.js <json postman collection file path>
中运行它,它就会输出到ParsedCollection.json
文件中。之后将此文件导入邮递员。
试试这个
// create application/json parser
app.use(bodyParser.json());
// parse various different custom JSON types as JSON
app.use(bodyParser.json({ type: 'application/*+json' }));
// parse some custom thing into a Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }));
// parse an HTML body into a string
app.use(bodyParser.text({ type: 'text/html' }));
// parse an text body into a string
app.use(bodyParser.text({ type: 'text/plain' }));
// create application/x-www-form-urlencoded parser
app.use(bodyParser.urlencoded({ extended: false }));
我想添加一个答案,因为发送为 form-data
似乎有问题,即使我将 Content-Type: multipart/form-data
添加到 Header(已列出正确 header 键入文档)。我想知道是否因为在 express 中使用 BodyParser,所以数据必须以 JSON 原始形式输入。我发誓我以前 form-data
工作过,唉。
以下是我如何让 req.body
不为空:
- 确保在“Headers”选项卡中,您设置了这个键值对:
Content-Type: application/json
旁注:关于 all available header content type values 上的堆栈溢出文章很有趣 link。
- 在“Body”选项卡中,确保选择了
raw
单选按钮,并且最右侧的下拉菜单选择了JSON
:
- 现在,如果我在我的 Express 应用程序中控制日志
req.body
,我会看到打印的内容:
花了 2 天和几个小时后,我意识到我需要更改 postman : Text to JSON
如果您使用的是 express 16.4 及更高版本, 确保你有:
const express = require("express"); require("dotenv").config({ path: "./config/.env" }); require("./config/db"); const app = express(); const userRoutes = require("./routes/user.routes"); app.use(express.json()); //this is the build in express body-parser app.use( //this mean we don't need to use body-parser anymore express.urlencoded({ extended: true, }) ); //routes app.use("/api/user", userRoutes); // connect to the server app.listen(process.env.PORT, () => { console.log(`lestening port ${process.env.PORT}`); });
由于您将请求作为表单数据发送,因此请使用 express
或 body-parser
.
bodyParser = require('body-parser').urlencoded({ extended: true });
app.post('/itemSearch', bodyParser, function(req, res) {
//var Keywords = req.body.Keywords;
console.log("Yoooooo");
console.log(req.headers);
console.log(req.body);
res.status(200).send("yay");
});
您好,您不需要正文解析器
const StringDecoder = require("string_decoder").StringDecoder;
_server.post("/users", function (req, res) {
const decoder = new StringDecoder();
let buffer = "";
req.on("data", function (data) {
buffer += decoder.write(data);
});
req.on("end", function () {
try {
console.log(JSON.parse(buffer));
res.json({ success: "ok });
} catch (e) {
console.log(e);
}
});
});