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

9nvpjoqh  于 2023-01-11  发布在  Java
关注(0)|答案(2)|浏览(104)

我是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现在返回响应未定义。

e1xvtsh3

e1xvtsh31#

我个人使用的是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将在查询完成时解析。
然后在解析一个字段时,你只需要在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]);
      },
    },
  }),
});
ifmq2ha2

ifmq2ha22#

我知道这是一篇老文章,但我发现这个主题有点混乱,我一直在研究不同的方法,这里展示了两种方法。一种比另一种(getQuery)稍微简单一些。我包括了一个变异的代码,尽管它与这个主题基本无关,但它演示了这种承诺复杂性如何不适用于返回变异的结果,只是说说而已。
文档描述了另一种方法,称为承诺 Package 器https://github.com/sidorares/node-mysql2#using-promise-wrapper。在我的情况下,这将需要一个顶级的等待,这并不真正适合我的需要,虽然有各种各样的变通办法,但我只是想对一个简单的问题尽可能简单的解决方案。

resolver.ts

import db from "db";
    
    // this is one way of doing it
    const getQuery = async (sql: string) => {
      const [rows] = await db.promise().query(sql);
      return rows;
    };
    
    // and this is another
    const getQuery2 = (sql: string) => {
      return new Promise((resolve, reject) => {
        db.query(sql, (error, results) => {
          if (error) return reject(error);
          return resolve(results);
        });
      });
    };
    
    export const resolvers = {
      Query: {
        getUsers: () => getQuery("SELECT * FROM `users`"),
      },
      Mutation: {
        userLogin: (_, { email, password }) => {
          return {
            __typename: "UserLoginResponse",
            status: "success",
            jwt: "abc123",
          };
        },
      },
    };

db.ts

import mysql2 from "mysql2";

console.log("connecting to RDS db:", process.env.DB_BOOK_IT_HOST);

export const db = mysql2.createConnection({
  host: process.env.DB_BOOK_IT_HOST,
  user: process.env.DB_BOOK_IT_USER,
  password: process.env.DB_BOOK_IT_PASSWORD,
  database: process.env.DB_BOOK_IT_DATABASE,
});

export default db;

相关问题