NodeJS console.log有效,但response.write没有

时间:2013-07-13 07:34:19

标签: node.js response

我是NodeJS的新手。

我正在阅读this book来学习它。

我在其中一个请求处理程序模块中使用以下代码。 基本上,当我从浏览器收到请求时,我会调用此函数并在屏幕上显示的窗口中获取“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;

非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

我认为你的请求破解的原因是它看起来像response.writeHead被调用两次,一次在server#onRequest中,一次在requestHandlers #upload中。

Node.js Docs - response.writeHead

一旦你对Node感觉更舒服一点,我可能会建议从server.js中提取任何响应写入/结束代码并实现一个中间件方法,其中每个请求都通过每个requestHandler传递,直到匹配或得到到最后。

希望有所帮助 - 快乐的noding!

编辑:+1安德烈亚斯的评论。不是上传路由上的问题,因为这是同步的,但是在requestHandlers #start中,一旦调用了exec,控制流就会继续返回到调用response.end()的server.js。