TypeError:无法调用未定义的方法'writeHead'

时间:2013-11-19 19:23:50

标签: javascript node.js

我正在使用索引,服务器,路由器和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;

1 个答案:

答案 0 :(得分:1)

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

未导出RequestHandlers函数start。因此,index.js不可能使用该函数。您需要先在requestHandlers.js文件中添加它

exports.start = start;

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

handle[pathname](response);

最后,server.js中的一个非常小的问题。您没有在第一次调用路由中传递正确数量的参数。所以删除路由(句柄,路径名)。其次,在第二次调用中,您交换了两个变量。您无法通过请求和响应执行此操作,因为node.js查找要输出的响应的变量响应,并且请求是针对对服务器发出的任何请求。您需要更正对server.js的调用

route(handle,pathname,request,response);

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