我遇到类似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中的一个问题,不是吗?感谢。
...勒
答案 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文件的注释中。