猿问

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

我尝试将它与上下文连接一起使用,并将订阅参数添加到 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"

        }

 }


繁星淼淼
浏览 163回答 3
3回答

RISEBY

您可以在上下文回调时检查 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})

侃侃无极

我只是这样做解决它: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 "";                }             }         }       },    });
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答