2

我遇到请求发射器确实发出“数据”事件但不发出“结束”事件的情况。我不确定如何排除故障。你会怎么做?

var Review = require('../lib/review')
    , qs = require('querystring');

exports.processReview = function(req, res){
        var body = '';
        req.setEncoding('utf8');
        req.on('data', function(chunk){body += chunk});
        req.on('end', function(){
            console.log('got here: ' + body);
            var obj = qs.parse(body);
            var review = new Review({
                title: obj.param('title'),
                content: obj.param('content'),
                submittedBy: obj.param('submittedBy'),
                recommendedFor: obj.param('recommendedFor')
            });
            console.log('New Review: ' + JSON.stringify(review));
            res.end('Ok\n');
        });
        res.end('Ok\n');
        console.log('_________end______' + body);
    };

    exports.displayForm = function(req, res){
        var html = '<html><head><title>some head</title></head><body><h1>Review Form</h1>'
            + '<form method="post" action="/process/review" >'
            + '<p>Title: <input type="text" name="title" /></p>'
            + '<p>Content: <input type="text" name="content" /></p>'
            + '<p>Nickname: <input type="text" name="submittedBy" /></p>'
            + '<p>Recommended for: <input type="text" name="recommendedFor" /></p>'
            + '<p><input type="submit" value="Submit Review" /></p>'
            + '</form></body></html>';
        res.setHeader('Content-Type', 'text/html');
        res.setHeader('Content-Length', Buffer.byteLength(html));
        res.end(html);
    };

您将如何解决此问题?问题是什么?谢谢你

4

2 回答 2

3

如果您使用的是 expressbodyParser或任何类似的中间件,那么end在它到达您的处理程序之前已经发出。

但就像我在评论中说的那样,如果你使用快递,你也会让事情变得对自己太难了。在这种情况下,您无需担心。end让中间件负责解析正文。

并且通过使用res.send,您可以让 express 处理其他常见任务。 send基本上是围绕节点的end. 举几个例子,它:

  • 接受 HTTP 状态、正文或两者作为参数
  • 将对象转换为 json 响应
  • 设置内容长度和其他标题
  • 计算并设置 etag
  • 为命中新缓存的请求发送 304
  • 发送无身体发送的头部响应

您的处理程序可以编写如下:

var Review = require('../lib/review');

exports.processReview = function(req, res){
  // the bodyParser (if it is in fact already a middleware) will have parsed
  // the request body already into `req.body`
  var review = new Review({
    title: req.body.title,
    content: req.body.content,
    submittedBy: req.body.submittedBy,
    recommendedFor: req.body.recommendedFor
  });
  console.log('New Review: ' + JSON.stringify(review));
  // here you'd probably save your view before sending.
  res.send(200);
};

exports.displayForm = function(req, res){
  // here you could keep your html in a template (e.g. /views/form.html), then:
  // res.render("form");

  // but even without doing that, express handles setting the content-type
  // and body length, like so:
  var html = '<html><head><title>some head</title></head><body><h1>Review Form</h1>'
    + '<form method="post" action="/process/review" >'
    + '<p>Title: <input type="text" name="title" /></p>'
    + '<p>Content: <input type="text" name="content" /></p>'
    + '<p>Nickname: <input type="text" name="submittedBy" /></p>'
    + '<p>Recommended for: <input type="text" name="recommendedFor" /></p>'
    + '<p><input type="submit" value="Submit Review" /></p>'
    + '</form></body></html>';
  res.send(html);
};
于 2013-04-06T16:40:50.937 回答
1

在您的processReview函数中,您将结束每个请求的响应。

    res.end('Ok\n'); // end response
    console.log('_________end______' + body);

请求已完成处理,res.end不再监听/处理更多事件。由于您res.end无条件执行,它不会到达end请求的事件处理程序。

于 2013-04-06T16:43:37.950 回答