如何使用 apollo graphql 服务器运行 nodejs

Posted

技术标签:

【中文标题】如何使用 apollo graphql 服务器运行 nodejs【英文标题】:How to run nodejs with apollo graphql server 【发布时间】:2018-02-23 10:22:59 【问题描述】:

您好,我在我的应用程序中使用 Apollo GraphQL 服务器、mongodb、nodejs。我有架构、解析器和movies.js

schema.js

const typeDefs = `
    type Movie 
         _id: Int!
        name: String!
    
    type Query 
        mv: [Movie]
    
`;
module.exports = typeDefs;

解析器.js

const mongoDB = require("../mongoose/connect");

const resolvers = 
  Query: 
    mv: async (root, args, context) => 
      return await mongoDB.connectDB(async err => 
        if (err) throw err;
        const db = mongoDB.getDB();
        db
          .collection("movie")
          .find()
          .toArray(function(err, result) 
            if (err) throw err;
            return JSON.stringify(result);
            db.close();
          );
      );
    
  
;
module.exports = resolvers;

电影.js

var express = require("express");
var bodyParser = require("body-parser");
const  graphqlExpress  = require("apollo-server-express");
const  makeExecutableSchema  = require("graphql-tools");

const createResolvers = require("../graphql/resolvers");
const typeDefs = require("../graphql/schema");
const resolvers = require("../graphql/resolvers");

var router = express.Router();

const executableSchema = makeExecutableSchema(
  typeDefs,
  resolvers
);

router.get(
  "/",
  bodyParser.json(),
  graphqlExpress(
    executableSchema
  )
);

module.exports = router;

app.js

var graph = require("./routes/movie");
app.use("/movie", movie);

当我尝试访问它http://localhost/movie 时,我收到此错误 GET 查询丢失。

有谁知道我做错了什么?

【问题讨论】:

【参考方案1】:

/movie 被声明为 GraphQL 端点,因此您必须向其发送 (GraphQL) 查询。

使用GET 端点,您可以通过将查询作为(URL 转义)查询参数传递来做到这一点:

http://localhost/movie?query=...

(记录在这里:http://dev.apollodata.com/tools/apollo-server/requests.html#getRequests)

要发布查询 mv name ,URL 将变为:

http://localhost:3000/movie?query=%7B%20mv%20%7B%20name%20%7D%20%7D

但我建议设置一个POST 端点,以便您可以发送POST requests。

此外,您传递给graphqlExpress 的属性名称不正确,应该是这样的:

router.get(
  "/",
  bodyParser.json(),
  graphqlExpress(
    schema : executableSchema
  )
);

【讨论】:

我正在使用这个localhost:3000/graph?query=querymv[name] 并得到"errors":["message":"Syntax Error GraphQL request (1:9) Expected Name, found [\n\n1: querymv[name]\n ^\n","locations":["line":1,"column":9]] "errors":["message":"Syntax Error GraphQL request (1:1) Cannot parse the unexpected character \"%\".\n\n1: %7B%20mv%20%7B%20name%20%7%E2%80%8C%E2%80%8BD%20%7D\n ^\n","locations":["line":1,"column":1]] @Nancy 查看我的更新答案。我发布的网址中有一些不应该存在的隐藏字符,我还发现了另一个问题。 谢谢。 mv 是数组类型。它应该 mv [ name ] 吗?我试图记录解析器db .collection("movie") .find() .toArray(function(err, result) if (err) throw err; console.log(result); return JSON.stringify(result); db.close(); ); 的结果,它打印[ _id: 59ba279e0a605b4a3bf93e76, name: 'Iron Man', year: 2017 ],但它发送给客户端"data":"mv":null 我的解析器异步或等待有问题? @Nancy 尝试返回result 而不调用JSON.stringify()。此外,db.close() 永远不会被调用,因为您在它之前返回。哦,你在你的解析器中混合了回调和承诺,这也不是一件好事。我会更新我的答案。

以上是关于如何使用 apollo graphql 服务器运行 nodejs的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apollo Server 时如何生成 schema.graphql 文件?

如何调试 nuxt-apollo 服务器端 graphql 请求

GraphQL + Apollo - 如何强制进行查询,似乎正在缓存一些东西

Apollo+React:如何使用代理使客户端和 graphql 在同一个域上?

如何使用 react-apollo 运行 graphQL 查询?

我在哪里可以获得有关如何使用 Apollo 和 GraphQL 获取数据的文档?