首页 > 解决方案 > 动态更改 socket.io 来源

问题描述

我正在使用 SocketIo 运行节点应用程序并在启动应用程序时创建套接字服务器。此时还指定了允许域的列表。

应用程序.js

async function listenCallback(server) {
    try {
        const domains = await db.raw('select distinct domain from users');
        global.io = new SocketIo(server, domains);
    } catch (err) {
        server.close();
    }
}

socket.js

class SocketIo {
    constructor(server, domains) {
        domains[0].map(row => {            
            whitelist.push(`https://${row.domain}:*`)
        });
        this.io = socketIo(server, {
            origins: whitelist.join(' '),
            secure: process.env.SSL_SERVER === 'true',
        });
    }

   updateOrigins(domains) {
       ???
   }

当服务器已经运行时,如何动态更新源(在 updateOrigins 中)?

标签: node.jssocket.io

解决方案


您可能想要查找每个连接的来源。像这样的东西会在每次连接尝试(未调试)时调用源验证函数。也许它会为你工作?

io.origins( function (origin, callback) {
  try {
    const sql = db.format ('select distinct domain from users where domain = ?', [origin])
    db.query(sql, function (error, results, fields) {
        if (error) {
            console.error ('error looking up origin in database', origin, error)
            return callback ('origin lookup failed', false)
        }
        /* if we got any rows back, we have an origin match */
        if (results.length > 0) return callback (null, true)
        return callback ('origin not allowed', false)
    })
  }
  catch (err) {
    console.error ('error looking up origin in database', origin, err)
    return callback('origin lookup failed', false)
  }
});

您可能希望实现某种原始缓存以避免过于频繁地重复数据库查找。


推荐阅读