Node.js + Socket.io |在服务器上设置自定义标头

Posted

技术标签:

【中文标题】Node.js + Socket.io |在服务器上设置自定义标头【英文标题】:Node.js + Socket.io | Set custom headers on the server 【发布时间】:2017-09-01 21:02:06 【问题描述】:

我使用 Helmet 和 Express 从服务器端设置相当多的安全 HTTP 标头。这很好,当在 node.js 应用程序上渲染客户端页面时,使用:

var app = express();
app.use(helmet());
..
res.render("pages/index", data);

索引页面上的所有资源都将具有 Helmet 标头。不幸的是,socket.io 有自己的标头管理。因此,/socket.io/ 之后的任何内容都将具有不安全/自己的标头。例如这里:

<https_path>/socket.io/socket.io.js
<https_path>/socket.io/?EIO=3&transport=polling&t=Lj4CFnj&sid=ILskOFWbHUaU6grTAAAA

因此,我想手动为所有 socket.io 项目设置自定义标头。

这就是我需要 socket.io 的方式(仅摘录):

/src/app.js

var express = require("express");
var sio = require("socket.io");
var app = express();
var io = require("./../lib/io.js").initialize(app.listen(REST_PORT, () => 
    logger.info("Application ready on port " + REST_PORT + " . Environment: " + NODE_ENV);
));

/lib/io.js

exports = module.exports = ;
var sio = require("socket.io");
exports.initialize = function(server) 
    var options = 
        cookie: false,
        extraHeaders: 
        "X-Custom-Header-For-My-Project": "Custom stuff",
        
    ;
    io = sio(server, options);
    io.on("connection", function(socket) 
    // logic
);

“extraHeaders”选项不起作用,我想它只能与 socket.io-client 一起使用。我做了大量的谷歌搜索,但没有运气。

还查看了如何使用 socket.request(显然它有助于标头,根据:here),但我也想不通。

你们能帮忙吗?

【问题讨论】:

【参考方案1】:

extraHeaders 选项将按如下方式工作,因为您需要删除“运输:['polling']”,以防您正在使用,并使用以下模式。这对我有用,并且能够发送自定义标题。

使用的包:- "socket.io-client": "^2.2.0",

this.socket = io(environment.host, 
   path: `/api/backend/socket.io`,
   origins: '*:*',
   // transports: ['polling'],
   transportOptions: 
     polling: 
        extraHeaders: 
           'authorization': token,
           'user-id' : userId
        
     
    
 )

参考:-https://socket.io/docs/client-api/#With-extraHeaders

【讨论】:

以上是关于Node.js + Socket.io |在服务器上设置自定义标头的主要内容,如果未能解决你的问题,请参考以下文章

本地网络上的 Socket.io/node.js?

Node.js + Socket.io |在服务器上设置自定义标头

Node.js socket.io.js 未找到或 io 未定义

Socket.io 使用 node.js,根本没有 express?

Flask socket.IO 服务器上的 Node.js Socket.io 客户端

Node.js 和 Socket.IO 在某些服务器中没有响应