2014-11-17 4 views
1

Так что это, наверное, очень простой вопрос, но я больше не работал в течение часа и ничего не нашел. Я также попробовал распечатать объект запроса, и я не вижу ничего полезного.Получить данные из объекта запроса grunt-contrib-connect

Как получить данные или тело запроса клиента в определении промежуточного программного обеспечения 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 === '[email protected]') { 
      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; 
     } 

    } 
    } 
} 

ответ

2

Таким образом, выясняется, что для выполнения этой работы необходимо сделать пару вещей.

Как указано here, подключение в основном просто обертывание 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 === '[email protected]') { 
       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; 
     } 

    } 
    } 
} 
+0

Спасибо, что разместили это. Ты спас меня! Btw, он работал для меня без 'req.setEncoding ('utf8');' –

0

Я не мог это объяснить, но решение по @ static416 не работает для меня больше. Итак, я придумал новый:

Сначала установите пакет-парсер пакета npm и импортируйте его. Во-вторых, добавить к вашей промежуточного слоя:

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(); 
       }, ... 
     ) 
}, ...