我的应用程序.js
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const { ApolloServer } = require('apollo-server');
const { startStandaloneServer } = require('@apollo/server/standalone');
const typeDefs = require('./apolloGraphql/schema');
const resolvers = require('./apolloGraphql/resolvers');
const auth = require('./Middleware/Auth');
dotenv.config({ path: './config/.env' });
const server = new ApolloServer({
typeDefs,
resolvers,
});
mongoose
.connect(process.env.MONGOURI)
.then((result) => {
return server.listen(process.env.PORT, (req, res, next) => {
console.log(`Server is Listening at PORT ${process.env.PORT}`);
});
})
.then((res) => {
return console.log(`Server is Running at ${res.url}`);
})
.catch((err) => {
console.log(err);
});
我的身份验证中间件
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
try {
const authHeader = req.get('Authorization');
if (!authHeader) {
const error = new Error('Not Authorized');
error.status = 500;
throw error;
}
const token = authHeader.split(' ')[1];
const decodedToken = jwt.verify(token, process.env.JWT_SECRET);
if (!decodedToken) {
const error = new Error('Not Authorized');
error.status = 500;
throw error;
}
req.userId = decodedToken.userId;
next();
} catch (err) {
console.log(err);
next(err);
}
};
如何像 Rest API 一样将此中间件传递到 Apollo 服务器。我是 Graphql 新手
我尝试像 Rest API 一样解决这个问题,并参考了一些项目和文档,但未能解决这个问题。我也很想知道套餐有没有变化
要将您的中间件传递到 Apollo Server,您需要使用 Apollo 的expressMiddleware,创建一个 Express 服务器添加您的中间件,然后将 Apollo 的中间件传递给它。
这是来自 Apollo 网站的示例(稍作修改),他们修改了 Express 中间件。
import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import express from 'express';
import http from 'http';
import cors from 'cors';
import bodyParser from 'body-parser';
import { typeDefs, resolvers } from './schema';
const app = express();
const httpServer = http.createServer(app);
const server = new ApolloServer({
typeDefs,
resolvers,
});
await server.start();
// Here you set up Express middleware
app.use(
'/',
cors(),
bodyParser.json({ limit: '50mb' }),
// You can add your custom middleware here
expressMiddleware(server, {
// You can also process the req and res objects and pass data to your resolvers
context: async ({ req }) => ({ token: req.headers.token }),
}),
);
await new Promise((resolve) => httpServer.listen({ port: 4000 }, resolve));
console.log(`🚀 Server ready at http://localhost:4000/`);
考虑到您可能不希望使用全有或全无的中间件来进行快速身份验证,因为它将保护整个 graphql 端点。只要您的登录是在 GraphQL 之外完成的(如在用于登录的 REST 端点中),就可以了。
您可以在此处了解如何在 Apollo 中实现身份验证逻辑