Node.js和连接模块:如何从发送到Web服务器的请求对象中获取消息

时间:2013-05-22 18:20:13

标签: node.js http connect

我正在使用Node.js并连接以创建一个简单的Web服务器。我有类似于以下代码的东西,我无法弄清楚如何从请求对象访问实际的请求消息体。我是新手,所以忍受我。我也拿出了一些不必要的例子。

function startServer(dir) {
  var port = 8888,
      svr  = connect().use(connect.static(dir, {"maxAge" : 86400000}))
                      .use(connect.directory(dir))
                      /*
                       * Here, I call a custom function for when 
                       * connect.static can't find the file.
                       */
                      .use(custom);

  http.createServer(svr).listen(port);
}

function custom(req, res) {
  var message = /* the message body in the req object */;
  // Do some stuff with message...
}

startServer('dirName');

有意义吗?我已经尝试将该对象记录到控制台,它充满了大量的东西。我可以轻松地在那里看到标题以及请求URL和方法。我似乎无法隔离实际的消息体。

2 个答案:

答案 0 :(得分:2)

您还应该包含connect.bodyParser中间件:

  svr  = connect().use(connect.static(dir, {"maxAge" : 86400000}))
                  .use(connect.directory(dir))
                  .use(connect.bodyParser())
                  .use(custom);

这将为您的处理程序提供已解析邮件正文req.body

如果您想要原始邮件正文,则不应使用它,而是自己阅读req邮件流:

function custom(req, res) {
  var chunks = [];
  req.on('data', function(chunk) {
    chunks.push(chunk);
  });
  req.on('end', function() {
    var rawbody = Buffer.concat(chunks);
    ...do stuff...
    // end the request properly
    res.end();
  });
}

答案 1 :(得分:1)

if(req.method == "POST"){
    var body = '';
    req.on('data', function(data){
        body += data;
    });
}

如果您正确发布,则正文应包含您的消息。

更好的想法是使用Express,然后使用bodysarser中间件 - 这将为您提供开箱即用的功能,而不用担心有人锤击您的服务器。上面的代码没有任何功能可以担心攻击 - 但它会让你开始。