图ql x MongoDB

图ql x MongoDB,mongodb,mongoose,graphql,graphql-js,Mongodb,Mongoose,Graphql,Graphql Js,我试图用graphql和mongoose从mongodb数据库中读取一些数据,但每次查询数据库时,它都返回null,但没有抛出错误。 代码如下: // Controller.js exports.user_read = function(id) { return new Promise((resolve, reject) => { Contact.findById(id, function(err, user) { err ? reject(err) : resol

我试图用graphql和mongoose从mongodb数据库中读取一些数据,但每次查询数据库时,它都返回null,但没有抛出错误。 代码如下:

// Controller.js
exports.user_read = function(id) {
  return new Promise((resolve, reject) => {
    Contact.findById(id, function(err, user) {
      err ? reject(err) : resolve(user);
    }
  });
}

// Resolver.js
var contact = require('Controller');
...
// root object passed as rootValue to graphqlHTTP
getUser: ({ id }) => { 
  contact.user_read(id)
}
...
任何提示和帮助都将不胜感激。 另外,我的所有查询在controller.js文件中采用相同的Promise格式时似乎也会出现这种情况。

您需要等待contact.user\u readid。没有等待,你只是在发回一个承诺。返回时它很可能处于挂起状态,因此返回为null

包括Daniel Rearden关于取消额外承诺的建议,下面是您的代码的外观:

// Controller.js
exports.user_read = async id => {
  return Contact.findById(id, (err, user) => {
      err ? reject(err) : resolve(user);
  });
}

// Resolver.js
var contact = require('Controller');
...
// root object passed as rootValue to graphqlHTTP
getUser: ({ id }) => { 
  return await contact.user_read(id)
}
...

您提供的代码似乎没有任何问题,只是不需要将Contact.findById包装在新的承诺中—只要省略回调,它就应该已经返回了承诺。不管怎样,这都不应该是个问题。如果通过调用GraphQL外部的findById可以获得所需的数据,那么问题可能在于GraphQL设置,您应该发布完整的模式和根对象。如果您无法让findById返回任何内容,即使在任何解析器之外,您也需要包括您的联系人模型以及如何连接到数据库。