使用xmlhttp.send()发送的数据在Express中的POST路由中附加到哪里?

时间:2016-09-16 07:14:50

标签: javascript node.js express xmlhttprequest

  

我通过在我的javascript代码中调用此函数来创建XMLHTTPRequest,如下所示

ajaxFunctions.ready(ajaxFunctions.ajaxRequest('POST', appUrl+'/new-poll/option-entered', value, function(data){
                    console.log(data);
                }));
  

然后我制作实际的xmlhttp请求,如下所示

var ajaxFunctions = {
  ready: function ready (fn) {
      if (typeof fn !== 'function') {
         return;
      }

      if (document.readyState === 'complete') {
         return fn();
      }

      document.addEventListener('DOMContentLoaded', fn, false);
  },
  ajaxRequest: function ajaxRequest (method, url, data, callback) {
      console.log('Entered the ajaxRequest function');
      console.log(data);
      var xmlhttp = new XMLHttpRequest();

      xmlhttp.onreadystatechange = function () {
         if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
            console.log('Making the request');
            callback(xmlhttp.response);
         }
      };

      xmlhttp.open(method, url, true);
      xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      xmlhttp.send(data);
  }
};
  

但是当我尝试在POST路由中访问下面的数据时,我收到一个错误,因为req.body似乎未定义。但是,我的res.json工作正常,这意味着我没有以正确的方式访问我传递的数据。

app.route('/new-poll/option-entered')
        .post(function(req, res){
            console.log(req.body.data);
            res.json('Hi I can return data');
        });
};
  

我承认这个问题可能只是重复,但我似乎无法找到我应该访问通过xmlhttp.send()发送的数据的确切位置!检查MDN文档后,我认为它可能附加到req.body,但返回undefined。那么我在哪里可以找到所附的数据,或者我在发送数据的方式上犯了错误,例如设置错误的RequestHeader?

1 个答案:

答案 0 :(得分:0)

您的Express服务器中似乎缺少body-parser中间件。如果您想使用req.body,则需要将其作为中间件添加到Express服务器。

  

摘自Express req.body docs

     

<强> req.body

     

包含请求正文中提交的键值对数据。默认情况下,它是未定义的,并在使用正文解析器和multer等身体解析中间件时填充。

您需要安装body-parser,因为它不是express包的一部分。

npm i --save body-parser

然后在您的路线之前将其添加到Express Server:

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

const port = process.env.PORT || 1337;

server.use(bodyParser.json()); // allows Content-Type application/json
server.use(bodyParser.urlencoded({ extended: true }); // parses Content-Type x-www-form-urlencoded

// Your routes go here

server.listen(port, () => { console.log(`listening on ${port}`); });