节点js + Sails js + websocket应用程序每隔几个小时崩溃

时间:2013-10-11 15:59:55

标签: javascript node.js express websocket sails.js

我遇到类似socket.io issue using sails.js的问题。每隔一段时间(每天一次,甚至几小时,它会有所不同),网站/应用程序的访问者将崩溃节点,似乎是由于他的websocket客户端尝试连接的方式。无论如何,这是崩溃日志:

debug:降低风帆......

/Volumes/Two/Sites/lsdfinder/node_modules/sails/node_modules/express/node_modules/connect/lib/utils.js:216
  return 0 == str.indexOf('s:')
                  ^
TypeError: Cannot call method 'indexOf' of undefined
    at exports.parseSignedCookie (/Volumes/Two/Sites/lsdfinder/node_modules/sails/node_modules/express/node_modules/connect/lib/utils.js:216:19)
    at Manager.socketAttemptingToConnect (/Volumes/Two/Sites/lsdfinder/node_modules/sails/lib/hooks/sockets/authorization.js:35:26)
    at Manager.authorize (/Volumes/Two/Sites/lsdfinder/node_modules/sails/node_modules/socket.io/lib/manager.js:910:31)
    at Manager.handleHandshake (/Volumes/Two/Sites/lsdfinder/node_modules/sails/node_modules/socket.io/lib/manager.js:786:8)
    at Manager.handleRequest (/Volumes/Two/Sites/lsdfinder/node_modules/sails/node_modules/socket.io/lib/manager.js:593:12)
    at Server.<anonymous> (/Volumes/Two/Sites/lsdfinder/node_modules/sails/node_modules/socket.io/lib/manager.js:119:10)
    at Server.EventEmitter.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2076:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:120:23)
    at Socket.socket.ondata (http.js:1966:22)
9 Oct 10:42:24 - [nodemon] app crashed - waiting for file changes before starting...

在config / sockets.js中,authorization设置为true。不知道还能做什么,在哪里解决这个问题。有什么建议?我也可以阅读Sails文档,但这似乎是Express / Connect中的一个问题,不是吗?感谢。

...勒

2 个答案:

答案 0 :(得分:4)

问题是,每隔一段时间,客户端就会连接没有cookie的连接。 Sails.js正在使用Connect中的util.parseSignedCookie()而不检查错误,因此会引发错误。这就是Sails中的样子:

if (handshake.headers.cookie) {
  handshake.cookie = cookie.parse(handshake.headers.cookie);
  handshake.sessionID = parseSignedCookie(handshake.cookie[sails.config.session.key], sails.config.session.secret);
}

如果您查看Connect的cookieParser()中间件,可以看到需要进行错误检查:

if (cookies) {
  try {
    req.cookies = cookie.parse(cookies);
    if (secret) {
      req.signedCookies = utils.parseSignedCookies(req.cookies, secret);
      req.signedCookies = utils.parseJSONCookies(req.signedCookies);
    }
    req.cookies = utils.parseJSONCookies(req.cookies);
  } catch (err) {
    err.status = 400;
    return next(err);
  }
}

我已经创建了一个Gist here来修复问题,并在我有空的时候向Sails.js提交拉取请求。 Gist使用Connect的cookieParser()中间件自动处理错误。如果要使用此功能,请在模块文件夹中修改此文件:

node_modules/sails/lib/hooks/sockets/authorization.js

答案 1 :(得分:1)

如果您正在执行跨域请求,则可以关闭授权。

* site_dir / config / sockets.js * 中将授权设置为 false 。一种方法。你也可以用这样的东西打电话给你的api

bash **http://localhost:1337?cookie=smokeybear**

它位于sockets.js文件的注释中。