在正文解析器中完成http请求流之前,路由器被调用

时间:2018-06-22 11:31:37

标签: javascript node.js

我有一个节点服务器(裸节点,无Express),它将请求发送到我编写的主体解析器,然后再将流发送到路由器。

每当我发出发布请求时,预期的行为是将请求流保存到Buffer中,然后在流结束时将其连接起来。结束时,将调用路由器。我已经放置了两个控制台语句,一个放置在主体解析器中(记录缓冲区),另一个放置在路由器中(记录req.body)。我希望每个发布请求都会打印两本日志,一本在正文分析器中,一本在路由器中。但是,我得到了三个日志,第一个是路由器中的日志(未定义),然后是来自主体解析器的缓冲区,然后是来自路由器的(req.body)。

让我感到困惑的是,尽管我只在req.on('end', callback)之后调用路由器,并且是调用路由器的回调,但看起来路由器被调用了两次。

//index.js
const http = require('http');

const bodyParser = require('./body-parser.js');
const router = require('./router.js');

const server = http.createServer((req, res) => bodyParser(req, res, router));

const hostname = '127.0.0.1';
const port = 4000;

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

//body-parser.js
module.exports = function bodyParser (req, res, next) {
  if (req.method === 'POST') {
    const body = [];
    req
      .on('data', chunk => body.push(chunk))
      .on('end', () => {
        console.log('buffer: ', body)
        req.body = JSON.parse(Buffer.concat(body).toString());
        next(req, res);
      });
  }
  next(req, res);
}

//router.js

const fs = require('fs');

const db = require('./db.js');


module.exports = function router (req, res) {

  if (req.url === '/messages' && req.method === 'GET') {
    // Get all messages
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end(JSON.stringify(db.msgs));
  } else if (req.url === '/messages' && req.method === 'POST') {
    // Post a message
    console.log('body in router: ', req.body)
    res.end();
  } 

0 个答案:

没有答案
相关问题