【问题标题】:connecting mongodb model to apollo-server 2.0将 mongodb 模型连接到 apollo-server 2.0
【发布时间】:2019-01-19 03:47:53
【问题描述】:

我正在关注一个使用 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}`)
)

【问题讨论】:

    标签: mongodb graphql apollo-server


    【解决方案1】:

    如果你想和以前一模一样,你需要在你的 ApolloServer 初始化中添加 context 函数:

    const server = new ApolloServer({
      typeDefs,
      resolvers,
      context: ({ req }) => ({
        Recipe,
        User
      })
    });
    

    【讨论】:

    • 非常感谢您修复了它,现在当我请求返回 id 时出现错误,我需要 JSON.stingify 模型吗?因为 id 是“ObjectID”,如果是这样,我需要在解析器中执行它还是可以在上下文中执行它?使用 apollo server v1,您可以像这样使用 bodyparser “app.use('/graphql', bodyParser.json(), graphqlExpress({ schema: myGraphQLSchema }));”但是对于 v2,据我在文档中可以看出,它已经内置了? [链接] (apollographql.com/docs/apollo-server/v2/…) 在 server.applyMiddleware({ app });但它不适合我?
    • ive set server.applyMiddleware({ app, bodyParserConfig:true });但还是不行?
    【解决方案2】:

    example 与 PG 完美搭配,如果您使用的是 Mongo,只需将 pg 调用替换为 mongoose 即可。

    【讨论】:

      猜你喜欢
      • 2020-06-13
      • 2018-07-10
      • 1970-01-01
      • 2019-02-22
      • 2020-09-18
      • 2017-08-13
      • 2021-12-24
      • 2020-08-13
      • 2016-12-10
      相关资源
      最近更新 更多