新手NodeJs开发人员在这里尝试将GraphQL查询直接发送到MongoDB,但它似乎不起作用。
这是查询解析器。
Query: {
users: (_, { count }) => GetAllUsers((users) => users),
user: (_, { id }) => GetUserByID(id, (user) => users),
},
我在GetAllUsers中使用回调
function GetAllUsers(callback) {
MongoClient.connect(dbUrl, (err, client) => {
if(err) throw err;
let db = client.db("tbase");
db.collection("Users", (err, coll) => {
coll.find().toArray((err, items) => {
if(err) throw err;
return callback(items);
})
})
})
}
和GetUserByID函数。
function GetUserByID(id, callback) {
MongoClient.connect(dbUrl, (err, client) => {
if(err) throw err;
let db = client.db("tbase");
db.collection("Users", (err, coll) => {
coll.findOne({id: id}, (err, res) => {
if(err) throw err;
return callback(res);
})
})
})
}
GetAllUsers和GetUserByID函数都需要几秒钟才能加载数据,这是我没有真正拥有的时间,因为我立即将结果传递给GraphQL。
当我尝试这样的事情时:
let usersArr;
GetAllUsers((users) => { usersArr = users; })
usersArr未定义几秒钟,然后数据变得可访问。
现在请记住,我一直在.NET框架和MSSQL中工作,这个异步的东西和NoSQL数据库对我来说非常混乱。
任何帮助都将不胜感激。
答案 0 :(得分:0)
通过承诺来管理。这是代码:
GetAllUsers:
const GetAllUsers = function(count) {
let promise = new Promise(function(resolve, reject){
MongoClient.connect(dbUrl, (err, client) => {
if(err) throw err;
let db = client.db("tbase");
db.collection("Users", (err, coll) => {
coll.find().toArray((err, items) => {
if(err) throw err;
if(!count) resolve(items);
if(count) resolve(items.slice(0, parseInt(count)));
})
})
})
});
return promise;
}
GetUserByID
const GetUserByID = function(id) {
let promise = new Promise(function(resolve, reject) {
MongoClient.connect(dbUrl, (err, client) => {
if(err) throw err;
let db = client.db("tbase");
db.collection("Users", (err, coll) => {
coll.findOne({id: id}, (err, res) => {
if(err) throw err;
resolve(res);
})
})
})
});
return promise;
}
查询解析器:
Query: {
users: (_, { count }) => GetAllUsers(count, (users) => users),
user: (_, { id }) => GetUserByID(id, (user) => users),
},