将GraphQL查询直接发送到MongoDB

时间:2018-02-25 00:25:55

标签: node.js mongodb graphql

新手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数据库对我来说非常混乱。

任何帮助都将不胜感激。

1 个答案:

答案 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),
},