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

Mac*_*ion 1 javascript mysql node.js graphql

我是 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
        });
}
Run Code Online (Sandbox Code Playgroud)

下面是函数定义 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;
Run Code Online (Sandbox Code Playgroud)

Graphql 现在返回未定义响应。

小智 5

我个人使用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);
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

将查询包裹在 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]);
      },
    },
  }),
});
Run Code Online (Sandbox Code Playgroud)