mongodb - 将 mongodb 模型连接到 apollo-server 2.0
问题描述
我正在关注一个使用 mongo 数据库和 graphql 的教程,目前导师使用 apollo-server v1,但我使用的是 apollo-server v2,我遇到的问题是我在哪里将我的模型连接到 graphql,
const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const cors = require("cors");
require("dotenv").config({ path: "variables.env" });
const Recipe = require("./models/Recipe");
const User = require("./models/User");
// Bring in GraphQL-Express middleware
const { graphiqlExpress, graphqlExpress } = require("apollo-server-express");
const { makeExecutableSchema } = require("graphql-tools");
const { typeDefs } = require("./schema");
const { resolvers } = require("./resolvers");
// Create schema
const schema = makeExecutableSchema({
typeDefs,
resolvers
});
// Connects to database
mongoose
.connect(process.env.MONGO_URI)
.then(() => console.log("DB connected"))
.catch(err => console.error(err));
// Initializes application
const app = express();
const corsOptions = {
origin: "http://localhost:3000",
credentials: true
};
app.use(cors(corsOptions));
// Create GraphiQL application
app.use("/graphiql", graphiqlExpress({ endpointURL: "/graphql" }));
// Connect schemas with GraphQL
app.use(
"/graphql",
bodyParser.json(),
graphqlExpress({
schema,
context: {
Recipe,
User
}
})
);
const PORT = process.env.PORT || 4444;
app.listen(PORT, () => {
console.log(`Server listening on PORT ${PORT}`);
});
所以在 apollo-server v1 中,你在 graphqlExpress 中传入你的 mongo 模式(模型)
Connect schemas with GraphQL
app.use(
"/graphql",
bodyParser.json(),
graphqlExpress({
schema,
context: {
Recipe,
User
}
})
);
但在 v2 中,您不再使用 graphqlExpress 函数,
https://www.apollographql.com/docs/apollo-server/v2/migration-two-dot.html
那么我如何/在哪里将我的数据库模型传递给?
目前我有这个
const express = require ('express')
const mongoose = require ('mongoose')
const { ApolloServer } = require('apollo-server-express');
require('dotenv').config({path: 'variables.env'})
// mongo schemas/models
const Recipe = require('./models/Recipe')
const User = require('./models/User')
//Graphql schema
const {typeDefs} = require('./schema')
const {resolvers} = require('./resolvers')
// connects to database
mongoose.connect(process.env.MONGO_URI, {useNewUrlParser: true} )
.then(()=> console.log('DB connected'))
.catch(error => console.log(error))
const PORT = process.env.PORT || 4444;
const server = new ApolloServer({ typeDefs, resolvers });
const app = express();
server.applyMiddleware({ app });
app.listen({ port: PORT }, () =>
console.log(` Server ready at http://localhost:${PORT}${server.graphqlPath}`)
)
解决方案
如果你想和以前完全一样,你需要context
在你的 ApolloServer init 中添加这个函数:
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => ({
Recipe,
User
})
});
推荐阅读
- reactjs - Immer 未加载到项目中(IE11 支持)
- javascript - 在 Jquery-gallery 中使用 getElementsByClassName 或 querySelectorAll?
- javascript - 在nodejs上使用sqlite准备好的语句出现神秘的“行值滥用”错误
- angular - 为什么 `scrollIntoView` 在 Angular 中不起作用?
- amazon-web-services - AWS API Gateway:用户:anonymous 无权执行:execute-api:Invoke on resource:arn:aws:execute-api:
- java - micronaut @RequestScope - 不为每个传入的http请求创建bean
- matlab - MATLAB 自动生成函数来输入变量而不是 .txt 文件
- python - Opencv:rbg->hsv->rgb是无损的吗?
- c# - 如何在我的数据访问类库中获取模型
- php - 使用 Laravel 和 ajax 的内部服务器错误