为了账号安全,请及时绑定邮箱和手机立即绑定

我的 Apollo Server 的订阅不起作用:无法读取未定义的属性“标题”

我的 Apollo Server 的订阅不起作用:无法读取未定义的属性“标题”

繁星淼淼 2021-10-07 10:47:24
我尝试将它与上下文连接一起使用,并将订阅参数添加到 Apollo Server 中,但它不起作用。我是第一次使用 Apollo 服务器订阅,我不知道错误是在服务器配置中还是在解析器中。我在查询或突变中没有问题,问题是订阅。这是我的 index.js:    import express from 'express';    import { createServer } from 'http';    import { ApolloServer } from 'apollo-server-express';    import { typeDefs } from './data/schema';    import { resolvers } from './data/resolvers';    import cors from 'cors';    import jwt from 'jsonwebtoken';    const bodyParser = require('body-parser');    const PORT = process.env.PORT ||  4004;    const app = express();    app.use(bodyParser.json());    app.use(cors());    const server = new ApolloServer({          typeDefs,          resolvers,          context: async({req, connection}) => {            console.log("Context connection", connection)              const token = req.headers['authorization'];              if(connection){                return connection.context;              } else {                if(token !== "null"){                    try{                      //validate user in client.                      const currentUser = await jwt.verify(token, process.env.SECRET);              //add user to request              req.currentUser = currentUser;              return {                  currentUser              }               }catch(err){                return "";            }      }    }   },  subscriptions: {    path: "/subscriptions",    onConnect: async (connectionParams, webSocket, context) => {      console.log(`Subscription client connected using Apollo server's built-in SubscriptionServer.`)    },    onDisconnect: async (webSocket, context) => {      console.log(`Subscription client disconnected.`)    }   }});我的突变:    mutation {      pushNotification(label:"My septh notification") {        label      }    }我的查询:    query {      notifications {        label      }    }我的订阅:    subscription {      newNotification {        label      }    }错误是:{       "error": {         "message": "Cannot read property 'headers' of undefined"        } }
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您可以在上下文回调时检查 jwt 令牌


server = new ApolloServer({

  schema: schema ,

  graphiql: true ,

  context:({req, connection} )=>

    if connection

      token = connection.context["x-access-token"]

      decoded = await LoginService.verify token #verify by jwt


      if decoded == null

        throw new Error("auth required")

      return connection.context

    headers = req.headers

    token = headers["x-access-token"]

    decoded = await LoginService.verify token #verify by jwt

    return authed: decoded != null

})


查看完整回答
反对 回复 2021-10-07
?
侃侃无极

TA贡献2051条经验 获得超10个赞

我只是这样做解决它:


const server = new ApolloServer({

      typeDefs,

      resolvers,

      context: async ({ req, connection }) => {

        if (connection) {

         // check connection for metadata

         return connection.context;

        } else {

         // check from req

         const token = req.headers.authorization



        if(token !== "null"){

          try{


          //validate user in client.

          const currentUser = await jwt.verify(token, process.env.SECRET);


          //add user to request

          req.currentUser = currentUser;


          return {

              currentUser

          }   

        }catch(err){

            return "";

                }

             }


         }

       },



    });


查看完整回答
反对 回复 2021-10-07
  • 3 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信