request.body在node.js,express和body解析器中为空

时间:2017-07-20 10:12:12

标签: javascript node.js express xmlhttprequest body-parser

我正在尝试将请求“发布”到我的节点服务器。

以下是xhttp请求。

let parcel = {
  userId: userId, //string
  unitid: unitid, //string
  selections: selections //array
};

 //Call to the Server
 var oReq = new XMLHttpRequest();
 oReq.addEventListener("load", transferComplete);

 oReq.open("GET", "http://node.server.com/interaction", true);
 //oReq.setRequestHeader('Content-Type', 'application/json');
 oReq.send(parcel);

 function transferComplete(evt) {
     console.log(this.responseText);
 }

这是服务器代码

const express = require('express');
const bodyParser = require('body-parser');
var cors = require('cors');

let app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

const interaction = require('./routes/interaction');

app.use('/interaction', interaction);

app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

app.set("port", process.env.PORT || 5000);

var server = app.listen(app.get('port'), () => {
  console.log("server is started");
});

和交互路由器

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
  console.log(req.body)
  res.send(req.body);
});

module.exports = router;

请求收到响应,但console.log(req.body)返回一个空对象。我甚至检查过“req”对象。该对象中的body节点也是空的。我哪里错了。我在哪里可以收到服务器中的parcel对象?

1 个答案:

答案 0 :(得分:1)

您没有在客户端发送任何正文,因此您在服务器上没有收到它就不足为奇了。

根据定义,您正在制作没有正文的GET请求。

尝试使用curl向正文发出请求并查看您是否进入服务器 - 这样就可以消除Express或body解析器出现问题的可能性。确保使用正确的内容类型。

如果你想发送一个正文,那么:

  1. 使用在路由处理程序中支持它的HTTP方法(如POST)
  2. 在客户端使用相同的HTTP方法
  3. 实际上正确地发送了一些东西
  4. 如果您无法直接使用XMLHttpRequest(具有可怕的API),请使用jQuery,浏览器请求,SuperAgent,Axios,Got,Request,Reqwest等内容:

    另外,要调试请求中实际发送的数据,请参阅浏览器开发人员工具中的“网络”选项卡,并对发生的情况有一个非常好的了解,请使用netcat:

    $ nc -lp 3333
    

    它侦听端口3333(在本例中)并将使用所有标头和正文打印整个请求。例如,在浏览器中访问http://localhost:3333/xxx可能会打印:

    GET /xxx HTTP/1.1
    Host: localhost:3333
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/59.0.3071.109 Chrome/59.0.3071.109 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: en-US,en;q=0.8,pl;q=0.6
    Cookie: io=HQz0J7NwYj76pKf_AAAD
    

    请注意,它不会自动返回响应,它只适用于单个请求,因此您需要重新启动netcat命令再次测试它。