1

NodeJS は初めてです。

私はそれを学ぶためにこの本を読んでいます。

リクエスト ハンドラ モジュールの 1 つで次のコードを使用しています。基本的には、ブラウザからリクエストが来たらこの関数を呼び出して、画面に表示されたウィンドウの「DIR」コマンドの内容を取得します。

index.js ファイルは、webapp として実行するファイルです。

これはindex.jsです

var server = require("./server.js");
var router = require("./router.js");
var requestHandlers = require("./requestHandlers");

var handle = {};
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;

server.start(router.route, handle);

これはserver.js ですサーバーファイルはリクエストをルーターに送信します

var http = require("http");
var url = require("url");

function start(route, handle)
{
function onRequest(request, response)
{
    //console.log("Request recieved!");
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " has been recieved");
    response.writeHead(200, {"Content-Type": "text/plain"});

    route(handle, pathname, response);

    response.end();
}

http.createServer(onRequest).listen(8888);

console.log("Server started!");

}

exports.start = start;

これはrouter.js ですこれは、 index.jsで作成されたハンドル を使用するルーターです(リクエストをそれぞれのハンドラーにマップするために使用されます)。

function route(handle, pathname, response)
{
console.log("About to route the request " + pathname);
if(typeof handle[pathname] == 'function')
{
    handle[pathname](response);
}
else
{
    console.log("No request handler found for " + pathname);
    response.writeHead(404,{"Content Type": "text/plain"});
    response.write("404 not found");
    response.end();
}
}

exports.route = route;

そして最後に、 requestHandlers.jsでリクエストが処理される場所です。 ここでは、console.log ステートメントは正常に機能しているように見えますが、response.write ステートメントは機能していません。

var exec = require("child_process").exec;

function start(response)
{
    console.log("Request handler 'start' was called.");

    exec("dir", function(error, stdout, stderr) {
        response.writeHead(200,{"Content Type": "text/plain"});
        response.write("Hello Upload!");
        response.write(stdout);
        response.write("Hello!");
        console.log(stdout);
        response.end();
    });
}

function upload(response)
{
console.log("Request handler 'upload' was called.");
response.writeHead(200,{"Content Type": "text/plain"});
response.write("Hello Upload!");
response.end();
}

exports.start = start;
exports.upload = upload;

どんな助けでも大歓迎です

4

1 に答える 1

2

あなたのリクエストが壊れている理由は、response.writeHeadがserver#onRequestで1回、requestHandlers#uploadで1回、2回呼び出されているように見えるからだと思います。

Node.js ドキュメント - response.writeHead

Node に慣れてきたら、応答の書き込み/終了コードを server.js から取り出し、各要求が一致するか最後に到達するまで、各要求が各 requestHandler を通過するミドルウェア アプローチを実装することをお勧めします。 .

お役に立てば幸いです -- うなずきます!

編集: +1 アンドレアスのコメント。それはすべて同期であるため、アップロードルートの問題ではありませんが、 requestHandlers#start で exec が呼び出されると、制御フローは引き続き server.js に戻り、そこで response.end() が呼び出されます。

于 2013-07-13T17:03:51.187 に答える