node.js~表达req.on(' end')触发但不是req.on('数据')

时间:2017-03-18 19:06:06

标签: javascript node.js express

使用身体解析器

  
      
  • application / x-www-form-urlencoded body parser
  •   

  
      
  • json body parser
  •   

产生相同的结果。

这就是我调用API的方式

$.ajax({ type:'post', url:'/api/order', headers: { 'GreatestHits': 'SteveMillerBand' }, data: { 'the': 'greatest' } });

为什么没有.on('data')触发仅仅是body请求的data对象,几乎是?我看到表单数据记录到控制台。我也可以将帖子指向http://httpbin.org/post来证明这一点。 我只能相信Express是真正的c @ blocker。如果那不是它,那么我不知所措。

// this is the code being called by the $.ajax()
app.use(function (req, res) {
    console.log("app.use req.data", req.data);
    req.on('data', function (chunk) {
        console.log("req.use on data");
    }).on('end', function () {
        console.log("app.use on end");
    });
    res.sendStatus(200);
});

在以下每个模型的$.ajax()帖子上,根据以上代码,结果如下所示:

app.use(callback() {} )

  
      
  • 有req.body
  •   
  • 没有req.data(undefined)      
        
    • 不会触发.on('数据');
    •   
    • 不会触发.on(' end');
    •   
  •   

app.post(callback() {} )

  
      除非包含路径字符串,否则
  • 甚至不会被调用。
  •   

app.post('route', callback() {} )

  
      
  • req.body
  •   
  • 没有req.data(未定义)      
        
    • 不会触发.on('data');
    •   
    • 不会触发.on('end');
    •   
  •   

app.use('route', callback() {} )

  
      
  • req.body
  •   
  • 没有req.data(未定义)      
        
    • 不会触发.on('data');
    •   
    • 会触发.on('end');
    •   
  •   

1 个答案:

答案 0 :(得分:3)

评论主题已经太长,无法继续添加。不知道我能做什么更好,我发布这个作为继续谈话的答案。

此代码触发.on('end')

app.use(function (req, res, next) {
    console.log("app.use req.data", req.body);
    req.on('data', function (chunk) {
        console.log("req.use on data");
    }).on('end', function () {
        console.log("app.use on end");
    });
    next();
});

这是对上述的呼吁;

$.ajax({ type:'post', url:'/api/order', headers: { 'GreatestHits': 'SteveMillerBand' }, data: { 'the': 'greatest' } });

为什么.on('data')没有触发?我看到表单数据已记录到控制台。

另外。如果数据段被称为req.body,那么为什么不是req.on('body')

因为,我发现,Body-Parser.js完全消耗了从response获得的Node.js对象。它重新编写它,从而重新创建response作为与node.js response对象完全不同的对象。