我正在使用 (ws包) 在Node.js中提供WebSocket服务。我使用“on upgrade”事件来验证连接客户端,使用在URL参数中传递的令牌。根据这里的示例,如果令牌无效/缺失/过期,则使用以下(TypeScript)代码拒绝连接:
server.on('upgrade', async (req: Request, socket: Socket) => {
// Make sure that we only handle WebSocket upgrade requests
if (req.headers['upgrade'] !== 'websocket') {
socket.destroy(new Error(`Expected headers upgrade == 'websocket', received ${req.headers['upgrade']}`));
return;
}
if (_.get(this.config, 'security.enableAuth')) {
logger.info('[socket] security: validating the session key parameter');
const u = querystring.parse(req.url.substring(req.url.indexOf('?') + 1));
if (!u.sessionKey) {
logger.info('[debug] no session key found');
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
socket.destroy();
return;
}
const token = u.sessionKey as string;
let result: AuthResult;
try {
result = await auth(token);
} catch (err) {
logger.warn('[socket] error validating session key:', err);
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
socket.destroy();
return;
}
// and so on...
除了客户端没有收到401消息以外,其他都可以正常工作,也没有任何内容能够告诉我连接失败的原因。Chrome网络选项卡没有显示任何已接收的消息,关闭事件代码为1006(CLOSE_ABNORMAL),没有其他信息。如何传递合理的错误代码或消息,以便客户端知道连接失败的原因?