#node.js #mongodb #api #graphql
Вопрос:
Я пытаюсь перевести api Flask на сервер 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)
})
Комментарии:
1. вы должны проверить ответ БД …
console.log( GameModel.find().exec() );
2. Привет, спасибо за предложение. Похоже, что ответ бд пуст?
Ответ №1:
Я нашел ответ, попробовав множество различных поисков в stackoverflow. Оказывается, что mongoose.model предполагает, что любой передаваемый вами параметр является единственным и по умолчанию использует его во множественном числе. Так что мне действительно пришлось сдать экзамен:
const GameModel = Mongoose.model("game", gameSchema, "game");
Конечно, большинство людей, вероятно, не столкнутся с этой ошибкой, поскольку они, вероятно, назвали свои коллекции с учетом этого, возможно, есть один странный человек, который хотел использовать другое имя для своей коллекции, ИЛИ множественное число коллекции одно и то же единственное число. Я оставлю это для других, счастливого кодирования!