2012-02-17 13 views
2

Node Beginner BookでNode.jsを学習しています。 ノンブロッキング操作でリクエストを管理しようとすると、私は立ち往生します。Node.jsでノンブロッキング操作の応答リクエストハンドラ

私はlocalhost:8888に行くとファイルのリストを返しますが、私がlocalhost:8888/startまたは/ uploadに行くと404が見つかりません。どうして?

index.js

var server = require("./server"); 
var router = require("./router"); 
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) { 
    var pathname = url.parse(request.url).pathname; 
    console.log("Request for " + pathname + " received."); 

    route(handle, pathname, response); 
    } 

    http.createServer(onRequest).listen(8888); 
    console.log("Server has started."); 
} 

exports.start = start; 

requestHandlers.js

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

function start(response) { 
    console.log("Request handler 'start' was called."); 
    exec("ls -lah", function (error, stdout, stderr) { 
     response.writeHead(200, {"Content-Type": "text/plain"}); 
     response.write(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; 

router.js

function route(handle, pathname, response) { 
    console.log("About to route a request for " + 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; 

答えて

0

ハンドラのキーはすべて「/」で始まらないのですか?

2

それはあなたのindex.jsでハンドラのキーだ、彼らは次のようになります。

handle["/"] = requestHandlers.start; 
handle["/start"] = requestHandlers.start; 
handle["/upload"] = requestHandlers.upload; 

私はこれをテストしたのだが、

+0

+1それはそうです – Thariama

0

は次のように、exec呼び出しの引数としてresponseを追加間違いなく問題ですこれは:

function start(response) { 
    console.log("Request handler 'start' was called."); 
    exec("ls -lah", response, function (error, stdout, stderr) { 
     //   ^^^^^^^^ 
     response.writeHead(200, {"Content-Type": "text/plain"}); 
     response.write(stdout); 
     response.end(); 
    }); 
} 
関連する問題