Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Server Apollo服务器订阅中间件_Server_Apollo_Subscription - Fatal编程技术网

Server Apollo服务器订阅中间件

Server Apollo服务器订阅中间件,server,apollo,subscription,Server,Apollo,Subscription,我将currentuser auth传递给应用程序middlware,它工作正常。。。但当我在graphql中运行订阅时,它会说找不到当前用户。。。。我做错了什么,伙计们?当我从apollo服务器上删除currentuser时,它工作了……我正试图按照apollo网站上的文档来创建它 我曾尝试将逻辑移到阿波罗服务器的主体上,但由于某种原因,它没有成功 const express = require('express'); const mongoose = require('mongoose');

我将currentuser auth传递给应用程序middlware,它工作正常。。。但当我在graphql中运行订阅时,它会说找不到当前用户。。。。我做错了什么,伙计们?当我从apollo服务器上删除currentuser时,它工作了……我正试图按照apollo网站上的文档来创建它

我曾尝试将逻辑移到阿波罗服务器的主体上,但由于某种原因,它没有成功

const express = require('express');
const mongoose = require('mongoose');
const jwt = require('jsonwebtoken');
const cors = require('cors');
require('dotenv').config({ path: 'variables.env' });
const app = express();
const { createServer } = require('http');

const corsOptions = {
    origin:'http://localhost:8000',
    credentials:true
};

mongoose.set('useFindAndModify', false);

app.use(cors(corsOptions));

app.use(async (req , res , next) => {
    const token = req.headers["authorization"];
    if(token !== "null"){
      try{
          const currentUser = await jwt.verify(token, process.env.SECRET);
          req.currentUser = currentUser;
          console.log(currentUser)

      }catch(err){
          console.log(err)
      }
    }
    next();
})


const Event = require('./models/Event');
const User = require('./models/User');
const Message = require('./models/Messages');

const { ApolloServer } = require('apollo-server-express');

const { typeDefs } = require('./Schema');
const { resolvers } = require('./Resolvers');


mongoose
  .connect(process.env.MONGO_URI, {useNewUrlParser: true , useCreateIndex: true})
  .then(() => console.log('DB connected'))
  .catch(err => console.error(err))


  const SERVER = new ApolloServer({
    typeDefs,
    resolvers,
    context: ({req, res}) => ({
         Event,
         User,
         Message,
         currentUser:req.currentUser
      }),

    playground: {
      settings: {
        'editor.theme': 'dark'
      }
    }
  });

SERVER.applyMiddleware({ app , path:'/graphql' });

const httpServer = createServer(app);
SERVER.installSubscriptionHandlers(httpServer);

const PORT = process.env.PORT || 5000;

httpServer.listen({ port: PORT }, () =>{
  console.log(`In the case of subscriptions, you're using web sockets instead of regular http requests, so your token is available elsewhere, namely under 
connection.context.Authorization
(note the uppercase 'A'),
connection
being provided by the function attached to the
context
of your ApolloServer and being defined in the context of subscriptions.

You basically will want to move token verification to your ApolloServer declaration:

  const SERVER = new ApolloServer({
    typeDefs,
    resolvers,
    context: ({req, connection}) => ({
         Event,
         User,
         Message,
         currentUser: async () => {
           const token = connection
                         ? connection.context.Authorization
                         : req.headers.authorization
           return await jwt.verify(token, process.env.SECRET)
         },
      }),
    ...
const express=需要“express”; const mongoose=需要“mongoose”; const jwt=require'jsonwebtoken'; const cors=要求“cors”; 需要'dotenv'.config{path:'variables.env'}; const-app=express; const{createServer}=require'http'; 常数常数={ 来源:'http://localhost:8000', 凭据:正确 }; mongoose.set'useFindAndModify',false; app.usecorscorsOptions; app.useasync请求,res,next=>{ const token=请求头[授权]; iftoken!==null{ 试一试{ const currentUser=wait jwt.verifytoken,process.env.SECRET; req.currentUser=当前用户; console.logcurrentUser }捕手{ console.logerr } } 下一个 } const Event=require./models/Event'; const User=require'./models/User'; const Message=require./models/Messages'; const{ApolloServer}=require'apollo-server-express'; const{typeDefs}=require./Schema'; const{resolvers}=require'./resolvers'; 猫鼬 .connectprocess.env.MONGO_URI,{useNewUrlParser:true,useCreateIndex:true} .then=>console.log'DB connected' .catcherr=>console.error const SERVER=新服务器{ typeDefs, 解析器, 上下文:{req,res}=>{ 事件 使用者 消息 currentUser:req.currentUser }, 游乐场:{ 设置:{ “编辑主题”:“黑暗” } } }; applyMiddleware{app,路径:'/graphql'}; const httpServer=createServerapp; SERVER.installSubscriptionHandlershttpServer; const PORT=process.env.PORT | 5000; httpServer.listen{port:port},=>{
console.log`在订阅的情况下,您使用的是web套接字而不是常规http请求,因此您的令牌在别处可用,即在connection.context.Authorization下注意大写字母“A”,连接由附加到服务器上下文的函数提供,并在订阅上下文中定义。

您基本上希望将令牌验证移动到您的Apollo服务器声明中:

const SERVER=新服务器{ typeDefs, 解析器, 上下文:{req,connection}=>{ 事件 使用者 消息 当前用户:异步=>{ const令牌=连接 ?connection.context.Authorization :req.headers.authorization return wait jwt.verifytoken,process.env.SECRET }, }, ... 这是一个非常简单的示例,您可以检查req的存在,如果未设置连接或req,则生成错误,处理没有令牌的情况,等等,但您已经了解了基本的想法

请参阅阿波罗服务器文档中的,以获取更多参考