3

http://www.nodebeginner.orgでチュートリアルを読んでいますが、データ出力に奇妙な動作があります。Stackoverflow にも同様の質問がありますが、答えはありません。だから私はこのウェブサーバーのコードを持っています:

//server.js
var http = require('http')
var url = require('url')

関数の開始 (ルート、ハンドル) {
    関数 onRequest(リクエスト、レスポンス) {
        var postData = ""
        var パス名 = url.parse(request.url).pathname
        console.log("" + パス名 + " のリクエストを受け取りました。")

        request.setEncoding('utf8')
        request.addListener("データ", function(postDataChunk) {
            postData += postDataChunk
            console.log("受信した POST データ チャンク '" + postDataChunk +"'.")
        }))

        request.addListener("終了", function() {
            ルート (ハンドル、パス名、応答、postData)
        }))
        var content = route(ハンドル、パス名、レスポンス)
    }

    http.createServer(onRequest).listen(80, '192.168.1.34')
    console.log("サーバーが起動しました")
}

exports.start = 開始

requestHandler.upload を呼び出す router.js のコード - 私のバグのある関数

//router.js
関数ルート(ハンドル、パス名、応答、postData){
    console.log("" + パス名のリクエストをルーティングしようとしています)
    if (ハンドルの種類[パス名] === '関数') {
        handle[pathname](response, postData) //requestHandler.upload を呼び出します
    } そうしないと {
        console.log("No request handler found for " + pathname)
        response.writeHead(404, {'Content-Type': 'text/plain'})
        response.write("404 見つかりません")
        応答.終了()
    }
}

そして requestHandler.upload のコード

//requestHandler.js
関数アップロード(応答、postData){
    console.log("リクエスト ハンドラ 'upload' が POST データで呼び出されました: " + postData); //正常に動作します
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("送信しました: " + postData); //醜い動作
    応答.終了();
}

POST データに string があると仮定しましょうtext=123。この関数の最初の行は、 のような実数データを出力します"Request handler 'upload' was called with POST data: text=123"。ただし、この行response.write("You've sent: " + postData);はブラウザの次のメッセージに出力します: You've sent: undefined. 私は何を間違っていますか?

4

1 に答える 1

3

次の行のコードserver.js

var content = route(handle, pathname, response)

イベントリスナーでの呼び出しの前に最初に実行され、関数を実行しますが、引数"end"は省略されます。postData実行されます...

response.write("You've sent: " + postData);
response.end();

したがって、ブラウザに返される応答は次のとおりです。

You've sent: undefined

その後"end"、イベントがトリガーされ、イベントリスナーが呼び出します...

route(handle, pathname, response, postData)

これは正しく通過しpostData、これはコンソールに正しく出力されます。response.write(...)この時点での応答が終了しているため、への呼び出しは2回目にブラウザにポストバックされません。

それが問題を説明することを願っています。

編集答えは、通話を削除することです

var content = route(handle, pathname, response)

クライアントがデータの投稿を終了し、その時点で関数を"end"正しく実行しているときに、イベントが呼び出されます。route

于 2012-09-07T22:34:41.643 に答える