2

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

调试:降低帆...

/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 中,授权设置为 true。不知道还能做什么,在哪里解决这个问题。有什么建议么?我也可以阅读 Sails 文档,但这似乎是 Express/Connect 中的问题,不是吗?谢谢。

...勒内

4

2 回答 2

4

问题是,每隔一段时间,客户端就会连接没有 cookie。Sails.js 使用util.parseSignedCookie()from Connect 时不检查错误,因此会引发错误。这是它在 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);
}

如果您查看cookieParser()Connect 的中间件,您会发现需要进行错误检查:

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解决这个问题,并在我有时间的时候向 Sails.js 提交一个拉取请求。Gist 使用 Connect 的cookieParser()中间件来自动处理错误。如果要使用它,请在模块文件夹中修改此文件:

node_modules/sails/lib/hooks/sockets/authorization.js
于 2013-10-11T16:43:57.367 回答
1

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

*site_dir/config/sockets.js*中将授权设置为false。一种方法。你也可以用这样的方式调用你的 api

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

它在 sockets.js 文件的注释中。

于 2014-02-04T09:24:50.880 回答