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

Express やbodyParser類似のミドルウェアを使用しendている場合は、ハンドラーに到達する前に既に発行されています。

しかし、コメントで言ったように、エクスプレスを使用している場合は、自分自身に負担をかけすぎていることにもなります. この状況では心配する必要はありません。endボディの解析はミドルウェアに任せましょう。

また、 を使用res.sendすることで、その他の一般的なタスクも Express に任せることができます。 sendは基本的にノードのend. いくつか例を挙げると、次のとおりです。

  • HTTP ステータス、本文、またはその両方を引数として受け入れます
  • オブジェクトを json レスポンスに変換します
  • content-length およびその他のヘッダーを設定します
  • 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 に答える