返回 node-mysql 中 graphql 解析器函数的 mysql 查询

Posted

技术标签:

【中文标题】返回 node-mysql 中 graphql 解析器函数的 mysql 查询【英文标题】:Return mysql query for graphql resolver function in node-mysql 【发布时间】:2017-10-08 04:22:27 【问题描述】:

我是 graphql 和 node 的新手,很抱歉,如果这真的很简单,但我正在尝试执行 mysql 查询,以便 graphql 返回查询响应供客户端读取。我遇到的问题是因为 node-mysql 确实是异步查询,所以我无法直接获得查询响应。

经过一番修改,我想通了,新代码:

var root = 
    login: function(username, password) 
        var s = `select password from users where username='$username'`;
        var result = sql.query(s);
        return result.then(response => 
            return password == response[0].password
        );

这是sql.query的函数定义

exports.query = function(s, callback) 
    var promise = new Promise((resolve, reject) => 
        con.query(s, function(err, response) 
            if (err) throw err;
            resolve(response);
    );
);
return promise;

Graphql 现在返回未定义的响应。

【问题讨论】:

【参考方案1】:

我个人使用mysql,但应该不会有太大区别。

所以我这样做:

exports.getUser = ( id ) => 
  return new Promise((resolve, reject) => 
    let sql = `select * from users u where u.user_id = ?`;
    sql = mysql.format(sql, [id]);
    connection.query(sql, (err, results) => 
      if (err) reject(err);
      resolve(results);
    );
  );
;

将查询包装在 Promise 周围,当查询完成时它会解析。

然后在解析一个字段时,你只需在 promise 上调用 .then 并做任何你想做的事情。

const viewerType = new GraphQLObjectType(
  name: 'Viewer',
  fields: () => (
    user: 
      type: userType,
      args: 
        id: 
          type: GraphQLInt,
        ,
      ,
      resolve: (rootValue, args) => 
        return getUser( id: args.id ).then(value => value[0]);
      ,
    ,
  ),
);

【讨论】:

我更新了我的代码以按照你的方式执行,现在 graphql 显示未定义响应。另外,您定义解析函数的方式与我的方式有区别吗?我的代码中没有 GraphQLObjectType 的实例化。 您的.then 未正确返回。应该是.then((response) => password == response[0].password); 是的,刚刚修好了,非常感谢!在旁注中,您定义解析器的方式与我如何定义解析器之间的区别是什么?有关系吗? 嗯,实际上不确定。但我认为不同之处在于您在该领域是硬编码。所以,如果你想在其他地方重用login,创建一个对象类型是一个很好的方法。但在上述情况下,您只需使用truefalse 在一个地方验证登录,则无需创建新类型。

以上是关于返回 node-mysql 中 graphql 解析器函数的 mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询丢失导致在phpMyAdmin中返回的node-mysql

Nodejs学习笔记--- 与MySQL交互(felixge/node-mysql)

在 node-mysql 中使用 SSH 隧道连接到 MySQL

使用 node-mysql 和 ExpressJS 在一个请求中执行两个或多个查询

node-mysql中防止SQL注入

node-mysql 在查询中使用数组