使用http.post时,Express req.body为空

时间:2017-11-16 12:49:49

标签: javascript node.js express post

我不知道为什么req.body是EMPTY ...... app.js 使用正文解析器中间件(http://www.expressjs.com.cn/4x/api.html#req.body

var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var index = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// add baseurl
app.use('/api', index);
app.use('/api', users);

user.js的

router.route('/user')
.post(function (req, res, next) {
    console.log(req.body);
    console.log(req.headers);
    //console.log(JSON.parse(Object.keys(req.body)[0]));
    res.json({title: 'RESTful: POST...'});
});

我打印了标题:但是req.body是空的,我使用JSON.parse(Object.keys(req.body)[0])来解析其他类似问题的结果,但它没有对我有用 我使用邮递员来请求POST,

{ 'cache-control': 'no-cache',
'postman-token': 'db7766d7-767c-4d33-be3a-acfa18ac1d9c',
'content-type': 'application/x-www-form-urlencoded',
'user-agent': 'PostmanRuntime/6.4.1',
accept: '*/*',
host: 'localhost:3000',
'accept-encoding': 'gzip, deflate',
'content-length': '0',
connection: 'keep-alive' }

postman screenshot

2 个答案:

答案 0 :(得分:2)

您的路线似乎配置正确。通过尝试使用curl -d "@/path/to/payload.json" -H "Content-Type: application/json" -X POST http://localhost:3000/api/user 发出相同的请求,我将排除任何与邮递员有趣的业务。

Content-Type: application/x-www-form-urlencoded

那会怎么样?

编辑:根据我在评论中收集的内容,您发布的请求似乎包含{"name":"user"}标头,但是包含JSON正文Content-Type。换句话说,内容类型标题和正文不匹配

由于服务器期望URL编码内容,因此无法解析请求正文。因此,使Content-Type: application/x-www-form-urlencoded标题符合正文格式非常重要。所以在这种情况下,你有两个选择。

  1. 保留name=user并将正文更改为Content-Type: application/json
  2. 相应地将标题更改为{"name":"user"},并将正文保持为{{1}}

答案 1 :(得分:0)

试试这个包。传递表单数据时非常有用,而不是json格式。

https://www.npmjs.com/package/formidable