Server Apollo服务器订阅中间件
我将currentuser auth传递给应用程序middlware,它工作正常。。。但当我在graphql中运行订阅时,它会说找不到当前用户。。。。我做错了什么,伙计们?当我从apollo服务器上删除currentuser时,它工作了……我正试图按照apollo网站上的文档来创建它 我曾尝试将逻辑移到阿波罗服务器的主体上,但由于某种原因,它没有成功Server Apollo服务器订阅中间件,server,apollo,subscription,Server,Apollo,Subscription,我将currentuser auth传递给应用程序middlware,它工作正常。。。但当我在graphql中运行订阅时,它会说找不到当前用户。。。。我做错了什么,伙计们?当我从apollo服务器上删除currentuser时,它工作了……我正试图按照apollo网站上的文档来创建它 我曾尝试将逻辑移到阿波罗服务器的主体上,但由于某种原因,它没有成功 const express = require('express'); const mongoose = require('mongoose');
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,则生成错误,处理没有令牌的情况,等等,但您已经了解了基本的想法
请参阅阿波罗服务器文档中的,以获取更多参考