Express + Postman,req.body是空的

时间:2015-11-13 15:13:43

标签: node.js express postman

我知道这已被多次询问,但我一直在四处寻找,但仍无法找到问题的答案。

这是我的代码,我确保在定义路由之前使用和配置主体解析器。我只使用.json()和bodyParser,因为我现在只测试POST函数,但我甚至尝试过使用app.use(bodyParser.urlencoded({extended:true}) );

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来测试这条路线。 enter image description here

这是我收到的回复

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' }
{}

此时我真的很感激任何帮助。感谢。

8 个答案:

答案 0 :(得分:37)

花了几个小时后,我意识到需要将邮递员的Raw类型更改为JSON enter image description here

答案 1 :(得分:12)

AFAIK您需要使用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"
}

答案 2 :(得分:1)

我想添加一个答案,因为似乎无法以 form-data 的身份发送工作,即使我将 Content-Type: multipart/form-data 添加到标题中(这在文档中被列为正确的标题类型) )。我想知道是否因为在 express 中使用 BodyParser,数据必须以 JSON 原始形式传入。我发誓我以前让 form-data 去工作,唉。

以下是我如何让 req.body 不为空:

  1. 确保在“标题”选项卡中,您设置了此键值对:
Content-Type: application/json

set Content-Type as application/json

旁注:all available header content type values 上堆栈溢出文章的有趣链接。

  1. 在“正文”选项卡中,确保选中 raw 单选按钮,并且最右侧的下拉列表选中了 JSON

Select raw and JSON

  1. 现在,如果我在 express 应用中控制台日志 req.body,我会看到打印:

enter image description here

答案 3 :(得分:0)

在我的情况下,我通过在邮递员生成的导出集合"type":"text"文件中添加urlencodedjson项来解决它。我观察它,因为我的一些要求已成功完成。区别在于json生成的postman集合文件中缺少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文件中输出。之后将此文件导入邮递员。

答案 4 :(得分:0)

尝试一下

> genprime(7, all=TRUE)
[1] 2 3 5 7 11 13 17
> genprime(7, all=FALSE)
[1] 17

答案 5 :(得分:0)

花了 2 天和几个小时后,我意识到我需要更改 postman : Text to JSON

  1. 如果您使用的是 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}`);
    });
    

答案 6 :(得分:0)

由于您将请求作为表单数据发送,请使用 expressbody-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");
});

答案 7 :(得分:0)

在快速服务器中添加这一行对我有帮助。 它将 .env 文件内容添加到您的应用程序中。例如如果您使用 process.env.PORT 等...

import { config } from "dotenv";
config()