当graphQL的查询从mongodb返回空数据时,你应该检查啥?

Posted

技术标签:

【中文标题】当graphQL的查询从mongodb返回空数据时,你应该检查啥?【英文标题】:What should you check when graphQL's query return's empty data from mongodb?当graphQL的查询从mongodb返回空数据时,你应该检查什么? 【发布时间】:2021-06-18 01:11:17 【问题描述】:

我正在尝试将 Flask api 转换为 graphql 服务器。我可以让示例代码与测试 mongodb 集合一起使用,但我无法让我改编的代码在真正的 mongodb 服务器上工作。查询始终返回空数据响应。调试此代码的步骤是什么?

const Express = require("express");
const  graphqlHTTP  = require('express-graphql');
const Mongoose = require("mongoose");
const 
    GraphQLID,
    GraphQLString,
    GraphQLList,
    GraphQLNonNull,
    GraphQLObjectType,
    GraphQLSchema
 = require("graphql");

var app = Express();

Mongoose.connect("mongodb://localhost/treasure-chess");

//"persons" is the collection 
const GameModel = Mongoose.model("game", 
    black: String,
    white: String
);

const GameType = new GraphQLObjectType(
    //the name field here doesn't matter I guess...
    name: "Game",
    fields: 
        id:  type: GraphQLID ,
        black:  type: GraphQLString ,
        white:  type: GraphQLString 
    
);

const schema = new GraphQLSchema(
    query: new GraphQLObjectType(
        name: "Query",
        fields: 
            games: 
                type: GraphQLList(GameType),
                resolve: (root, args, context, info) => 
                    return GameModel.find().exec();
                
            ,
            game: 
                type: GameType,
                args: 
                    id:  type: GraphQLNonNull(GraphQLID) 
                ,
                resolve: (root, args, context, info) => 
                    return GameModel.findById(args.id).exec();
                
            
        
    ),
    mutation: new GraphQLObjectType(
        name: "Mutation",
        fields: 
            game: 
                type: GameType,
                args: 
                    firstname:  type: GraphQLNonNull(GraphQLString) ,
                    lastname:  type: GraphQLNonNull(GraphQLString) 
                ,
                resolve: (root, args, context, info) => 
                    var game = new GameModel(args);
                    return game.save();
                
            
        
    )
);

app.use("/graphql", graphqlHTTP(
    schema: schema,
    graphiql: true
));


app.listen(3000, () => 
    console.log("Listening at :3000...");
);

证明我正在连接到正确的 mongodb 文档:

更多证据:

我确实尝试了评论建议,结果发现结果是空的……:

                    var results = GameModel.find().exec()
                    results.then(game_info =>
                        console.log(game_info)
                    )

【问题讨论】:

你应该检查数据库响应...console.log( GameModel.find().exec() ); 您好,谢谢您的建议。似乎 db 响应为空? 【参考方案1】:

我在 *** 上尝试了一堆不同的搜索后找到了答案。事实证明, mongoose.model 假定您传递的任何参数都是单数的,并且默认情况下是复数形式。所以我实际上不得不通过:

const GameModel = Mongoose.model("game", gameSchema, "game");

当然,大多数人可能不会遇到此错误,因为他们可能会记住这一点来命名他们的收藏,可能会有一个奇怪的人想要为他们的收藏使用不同的名称,或者收藏的复数是相同的单数。我会把它留给其他人,祝你编码愉快!

【讨论】:

以上是关于当graphQL的查询从mongodb返回空数据时,你应该检查啥?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo graphql 正在为 mongodb 中的空子文档返回空数据

GraphQL 简单嵌套查询返回空字段

graphql 查询返回具有空 id 的对象

GraphQL 查询从 JSON 数据源返回 GraphiQL 和 App 中的空对象

GraphQL从axios返回空数据[重复]

Graphql apollo 客户端从 AppSync 返回空值