【问题标题】:TypeError: Cannot call method 'writeHead' of undefinedTypeError:无法调用未定义的方法“writeHead”
【发布时间】:2013-11-25 16:43:28
【问题描述】:

我正在使用索引、服务器、路由器和 requestHandler 运行一个简单的 nodejs 应用程序,它会在 response.writeHead(200,{"Content-Type":"text/html"});到达了。代码是:

文件 requestHandler.js:

    var querystring=require("querystring"),
    fs=require("fs"),
    formidable=require("formidable");

function start(response){
    console.log("Request handler 'start' was called.");
    var body='<html>'+
        '<head>'+
        '<meta http-equiv="Content-Type"'+
        'content="text/html; charset=UTF-8"/>'+
        '</head>'+
        '<body>'+
        '<form action="/upload" enctype="multipart/form-data"'+
        'method="post">'+
        '<input type="file" name="upload" mulitple="multiple">'+
        '<input type="submit" value="Upload file"/>'+
        '</form>'+
        '</body>'+
        '</html>';
    response.writeHead(200,{"Content-Type":"text/html"});
    response.write(body);
    response.end();
}

文件 index.js:

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

var handle={}
handle["/"]=requestHandlers.start;
handle["/start"]=requestHandlers.start;
server.start(router.route, handle);

文件 router.js:

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

文件 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);
            route(handle,pathname,response,request);
        }
        http.createServer(onRequest).listen(8888);
        console.log("Server has started");
    }
exports.start=start;

【问题讨论】:

  • 你从哪里调用start函数?
  • 什么是response?您正在使用未定义的 response 调用函数 start()
  • 添加了编辑,响应直接从服务器到路由器再到请求处理程序。
  • 来自 server.js 的 console.log("Request for " + pathname + " received"); 的 msg 是什么?
  • 如果我能正确理解这一切,handle[pathname](request, response); 是从 requestHandler.js 调用 start(response)

标签: javascript node.js


【解决方案1】:

我想指出您代码中的一些错误-

RequestHandlers 函数启动没有被导出。因此,index.js 不可能使用该功能。您需要先将其添加到您的 requestHandlers.js 文件中

exports.start = start;

下一个问题是在 router.js 中。如果满足 if 条件,则调用变量句柄 [pathname] 指向的函数。但是你传递了两个参数——请求和响应。您不需要将 start 函数与 request 一起传递,因为-a)该函数不接受它作为参数,并且 b)您不希望为请求收集任何内容。如果您确实需要从请求中获取一些信息(在 URL 中传递的变量),您可以将该参数添加到 start 函数并适当地处理它。但是现在只需在调用句柄 [路径名] 时删除该参数。所以,在 router.js 中编辑这一行-

handle[pathname](response);

最后,server.js 中的一个非常小的问题。您在第一次调用路由时没有传递正确数量的参数。所以删除路由(句柄,路径名)。其次,在您的第二次通话中,您交换了两个变量。你不能用 request 和 response 来做到这一点,因为 node.js 会为要输出的响应查找变量 reponse,而 request 是针对对服务器发出的任何请求。您需要更正对 server.js 的调用

route(handle,pathname,request,response);

这应该可以为您解决。我希望这会有所帮助。如果还有什么我可以解释的,请告诉我。

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多