【问题标题】:Return mysql query for graphql resolver function in node-mysql返回 node-mysql 中 graphql 解析器函数的 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 现在返回未定义的响应。

【问题讨论】:

    标签: javascript mysql node.js 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 在一个地方验证登录,则无需创建新类型。
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 2021-05-10
    • 2017-08-22
    • 2018-06-04
    • 2020-06-20
    • 2022-01-10
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多