运行用于Websocket连接的快速中间件

时间:2019-04-28 18:46:48

标签: javascript node.js express websocket apollo-server

我有一个带有一些中间件的Express应用程序,以及一个带有订阅的Apollo服务器。我认为这应该是相关的设置代码:

const app = express();
const ws = createServer(app);

app.use(cookieParser());
app.use(
  expressJwt({
    secret: config.auth.jwt.secret,
    credentialsRequired: false,
    getToken: req => req.cookies.id_token,
  }),
);
app.use(passport.initialize());

const server = new ApolloServer({
  ...schema,
  subscriptions: {
    path: '/subscriptions',
    onConnect: (connectionParams, webSocket) => {
      // TODO
      return {};
    },
  },
});
server.applyMiddleware({ app });
server.installSubscriptionHandlers(ws);

JWT存储在cookie中,并由cookieParser()expressJwt(...)提取和处理。在TODO,我可以访问webSocket.upgradeReq.headers.cookie,并且在这里也可以将其添加到websocket上下文中。但是,尤其是与身份验证有关的时候,我不想发布自己的版本来运行相关的中间件,也不愿复制整个身份验证。

执行此操作的好方法是什么?我想对webSocket.upgradeReq应用一系列中间件(至少到目前为止,我已经确定相关的中间件不涉及响应),使其尽可能适合常规流程。我正在考虑

  • 使用库(我见过express-websocket,但它似乎处于休眠状态,并且它的缓冲区内容确实令人毛骨悚然),
  • 创建第二个Express实例并进行连接,
  • 使用express(路由器?)中的一个组件,
  • 手动调用中间件

但是我对这一切还不够熟悉,以至于无法确定什么是最佳途径。

0 个答案:

没有答案