GraphQL x MongoDB

Posted

技术标签:

【中文标题】GraphQL x MongoDB【英文标题】: 【发布时间】:2017-12-21 04:38:25 【问题描述】:

我正在尝试使用 graphqlmongoosemongodb 数据库中读取一些数据,但每次查询数据库时它都会返回 @987654321 @ 但不会引发错误。 代码如下:

// 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.findById 包装在新的 Promise 中——它应该已经返回了一个 Promise只要你省略回调。无论哪种方式,这都不应该是一个问题。如果您可以通过调用 findById outside GraphQL 获得所需的数据,那么问题可能出在您的 GraphQL 设置上,您应该发布完整的架构和根对象。如果您无法让 findById 返回任何内容,即使在任何解析器之外,您也需要包含您的联系人模型以及您连接到数据库的方式。 【参考方案1】:

您需要await contact.user_read(id)。没有等待,你只是发回一个 Promise。它很可能在返回时处于挂起状态,因此返回 null

包括 Daniel Rarden 建议摆脱额外的 Promise,您的代码如下所示:

// 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)

...

【讨论】:

以上是关于GraphQL x MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

MongoDBMongoDB的一些操作命令

MongoDBMongodb——GridFS存储

mongoDBmongoDB副本集实战

MongoDBMongoDb数据结构

MongoDBmongodb设置用户访问权限

Vert.x - 带有 DataInputStreams 的 GraphQL 订阅