【问题标题】:TypeError: Cannot call method 'handle' of undefinedTypeError:无法调用未定义的方法“句柄”
【发布时间】:2014-06-20 17:59:50
【问题描述】:

我想使用节点 js 创建一个简单的 http 服务器,它会监听特定的端口。但我面临一个看起来像这样的错误:

/usr/local/lib/node_modules/express/lib/application.js:123
  this._router.handle(req, res, function(err) {
               ^
TypeError: Cannot call method 'handle' of undefined
    at Function.app.handle (/usr/local/lib/node_modules/express/lib/application.js:123:16)
    at Server.app (/usr/local/lib/node_modules/express/lib/express.js:28:9)
    at Manager.handleRequest (/home/node/node_modules/socket.io/lib/manager.js:565:28)
    at Server.<anonymous> (/home/node/node_modules/socket.io/lib/manager.js:119:10)
    at Server.EventEmitter.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2108:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
    at Socket.socket.ondata (http.js:1966:22)
    at TCP.onread (net.js:527:27)

下面是我写的代码:

var express = require('express'); 
var http = require('http'); 

var app = express();
var server = http.createServer(app);

server.listen(1200);

最近只有我升级了node版本并表达如下:

表达@4.4.1 节点@0.10.28

请任何人解释错误在哪里?

【问题讨论】:

  • 你没有显示整个代码,因为你的错误与socket.io有关
  • 是的,通过再次查看错误,确实,问题与 socket.io 相关,正如@mpm 所提到的,但您的代码并未告知这一点。
  • 为了您的信息,我已经提到了上面的完整代码。
  • 使用 node.js 调试器并打开异常中断功能,当错误弹出时检查调用堆栈和变量——尤其是应该定义但没有定义的变量。你的开发操作系统是什么?
  • 这不是 socket.io 问题。 socket.io 会自动劫持 http 请求,但这不是原因。原因是 express 没有明确的错误消息。至少从 express 版本 4.13.3 开始,此问题已得到修复。

标签: node.js http express


【解决方案1】:

我认为当您将浏览器指向服务器地址和端口时会出现此错误,对吧? 在这种情况下——通过查看你的代码——你会丢失这样的东西:

app.get('/', function(req, res, next) {
    res.send(200, "All set");
});

此外,不需要http 库:

var express = require('express'),
    app = express();

app.get('/', function(req, res, next) {
    res.send(200, "All set");
});

app.listen(1200);

应该可以。请告诉我。

这是一个使用 socket.io 的工作示例:

var express = require('express'),
    app = express(),
    server = require('http').Server(app),
    socket = require('socket.io')(server);

app.get('/', function(req, res, next) {

    socket.on('connection', function (socket) {
        socket.join('chatRoom');
    });

    socket.sockets.in('chatRoom').emit('message', 'Welcome in this room.');

    res.send(200, "All set");
});

app.listen(1200);

您仍然需要定义逻辑来拦截客户端上发出的事件。

【讨论】:

  • 我没有将浏览器指向服务器地址和端口;我只是在终端(putty)中运行上述代码。
  • 您发布的代码就是您正在运行的代码,您会收到该错误吗? - 这没有任何意义,因为您的错误中有一条套接字消息,但您的代码中没有套接字的痕迹。您发布的代码工作得很好。尝试运行我发布的示例,然后告诉我您遇到了什么错误。
  • 我没有明白你的意思,你说不需要 http 库。但是在上面你用 socket io 编写的例子中,你仍然使用了 http 库。
  • 对于 socket.io,你需要它。您最初的代码 -question- 没有提到任何关于套接字的内容,所以我的第一个代码示例/响应没有考虑到 socket.io。
猜你喜欢
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多