1

所以这可能是一个非常简单的问题,但我已经在谷歌上搜索了一个多小时,但什么也没找到。我也只是尝试打印出请求对象,但没有看到任何有用的东西。

如何在 grunt-contrib-connect 中间件定义中获取客户端请求的数据或正文?

connect: {
  main: {
    options: {
      hostname: "0.0.0.0",
      port: 8080,
      /**
       *  These are the mocked out backends for various endpoints
       */
      middleware: function(connect, options, middlewares) {
        middlewares.unshift(function(req, res, next) {
          if (req.url !== '/v1/accounts/_findEmail') {
            return next();
          }

          // ********
          // How do I get the data content of the request?
          var data = req.data; // Is undefined
          // ********

          if (data && data.email === 'taken@email.com') {
            res.writeHead(200, {"Content-Type": "application/json"});
            res.write(JSON.stringify({email:"found"}));
          } else {
            res.writeHead(404, {"Content-Type": "application/json"});
            res.write(JSON.stringify({email:"not found"}));
          }

          res.end();
        });

        return middlewares;
      }

    }
  }
}
4

2 回答 2

2

所以事实证明,要完成这项工作需要做几件事。

如此处所述,在这种情况下,connect 基本上只是包装了 NodeJS,我应该已经猜到了。所以那个请求对象实际上是http.ServerRequest,应该以同样的方式使用。

所以代替var data = req.data;我可以添加一个回调,req.on('data', function (data) { //do stuff });并以这种方式查看数据。

除此之外,在我读取数据之前,我必须添加req.setEncoding('utf8');它才能以字符串而不是十六进制数组的形式出现。

所以最终的解决方案如下:

connect: {
  main: {
    options: {
      hostname: "0.0.0.0",
      port: 8080,
      /**
       *  These are the mocked out backends for various endpoints
       */
      middleware: function(connect, options, middlewares) {
        middlewares.unshift(function(req, res, next) {
          if (req.url !== '/v1/accounts/_findEmail') {
            return next();
          }

          req.setEncoding('utf8');
          req.on('data', function (rawData) {
            var data = JSON.parse(rawData);

            if (data && data.email && data.email === 'taken@email.com') {
              res.writeHead(200, {"Content-Type": "application/json"});
              res.write(JSON.stringify({email:"found"}));
            } else {
              res.writeHead(404, {"Content-Type": "application/json"});
              res.write(JSON.stringify({email:"not found"}));
            }

            res.end();
          });
        });

        return middlewares;
      }

    }
  }
}
于 2014-11-17T18:39:13.457 回答
0

我无法解释,但@static416 的解决方案不再适合我。所以我想出了一个新的:

首先安装 npm 包 body-parser 并导入。其次,将其添加到您的中间件:

module.exports = function(grunt) {
    var bodyParser = require('body-parser');
    ...
}

现在您可以通过req.body在中间件内部使用来访问数据。

middleware: function(connect, options, middlewares) {
          // inject a custom middleware into the array of default 
          middlewares.unshift(
              bodyParser.urlencoded({extended: true}),
              bodyParser.json(),
              function(req, res, next){
                // use data from post request
                console.log(req.body);
                next();
              }, ...
          )
}, ...
于 2017-06-15T11:48:58.267 回答