如何从 MySQL 查询中将 json 返回到 GraphQL?

Posted

技术标签:

【中文标题】如何从 MySQL 查询中将 json 返回到 GraphQL?【英文标题】:How to return a json to GraphQL from a MySQL query? 【发布时间】:2018-11-03 00:52:04 【问题描述】:

我是 nodejs 和 qraphql 的新手,我正在尝试对 graphql 进行简单的查询。对 mysql 数据库进行查询后,我的问题是我不知道如何将数据正确发送到 graphql 以查看结果。

我必须尝试对解析进行字符串化,但它不起作用。我用 json 从 mySQL 返回结果,但它不起作用。为什么我在 Graphiql 中看不到结果?我必须如何返回解决方案?

这是我进行查询并返回结果的函数:

let getPlayer = (args) => 
    let id = args.id;
    console.log("id: " + id);
    let myPromise = new Promise((resolve, reject) => 
        const connection = mysql.createConnection(config.ddbb_connection);
        connection.connect();
        connection.query("select json_object('id', id) as player from tbl003_player where id = " + id, 
                        function (error, results, fields) 
            if (!error)
                if (results.length > 0)
                    resolve(results[0]);
                    console.log("resultado: " + results[0]);
                else
                    reject(new Error("No se ha encontrado ninguna jugadora con el ID: " + id));
                
            else
                reject(new Error("Se ha producido un error de acceso a BBDD"));
                         
          );
        connection.end();        
    );
    console.log("Salgo de la consulta");
    myPromise.then((resolve) => 
        console.log("resolve: " + JSON.stringify(resolve));
        return resolve;
    ,(error) => 
        console.log(error);
        return error;
    );
;

编辑我:

如果我将 JSON.stringify 更改为 JSON.parse,我会在控制台中收到此错误:

(node:31898) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)
    at myPromise.then (/home/josecarlos/Workspace/graph-ql/primer-server-express/routes-api.js:68:21)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
(node:31898) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing insideof an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:31898) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

编辑二:

我已经修复了返回 JSON.parse(resolve) 时的错误,但它不起作用:( 我在 GraphiQL 中仍然遇到此错误:


  "data": 
    "player": null
  

我管理 myPromise 的代码现在是这个 ...

myPromise.then((resolve) => 
    console.log("resolve: " + JSON.stringify(resolve));
    data = JSON.parse(resolve);
    return data;
,(error) => 
    console.log(error);
    return error;
).catch(() => 
    console.log("Entro dentro del catch");
);

编辑 III:

我们有这个字符串 "player":"\"id\": 11" 和 JSON.stringify(resolve)。我认为我只需要返回 \"id\":11。我怎样才能做到这一点?知道如何将 json 返回到 GraphiQL 吗?

编辑 IV:

我已经修改了我的代码,只返回带有 return resolve(results[0].player) 的 json,但它不起作用!!!

这是我的实际代码:

let getPlayer = (args) => 
    let id = args.id;
    console.log("id: " + id);
    let myPromise = new Promise((resolve, reject) => 
        const connection = mysql.createConnection(config.ddbb_connection);
        connection.connect();
        connection.query("select json_object('id', id) as player from tbl003_player where id = " + id, 
                        function (error, results, fields) 
            if (!error)
                if (results.length > 0)
                    resolve(results[0].player);
                    console.log("resultado: " + results[0].player);
                else
                    reject(new Error("No se ha encontrado ninguna jugadora con el ID: " + id));
                
            else
                reject(new Error("Se ha producido un error de acceso a BBDD"));
                         
          );
        connection.end();        
    );
    console.log("Salgo de la consulta");
    myPromise.then((resolve) => 
        console.log("resolve: " + JSON.stringify(resolve));
        return JSON.parse(resolve);
    ,(error) => 
        console.log(error);
        return error;
    ).catch(() => 
        console.log("Entro dentro del catch");
    );
;

【问题讨论】:

【参考方案1】:

问题应该是在你的承诺得到解决之前你已经从你的解析器返回,因此你总是得到 null:


  "data": 
    "player": null
  

您可以做的是,在您的解析器中等待 return util 您的承诺已经解决,如下所示:

async getPlayer(obj, args, context) => 
    ...
    let myPromise = new Promise((resolve, reject) => 
        ...
    );
    console.log("Salgo de la consulta");
    let result;
    try 
      result = await myPromise;
     catch(error) 
      return error;
    
    return JSON.stringify(result);
;

【讨论】:

【参考方案2】:

您是否尝试过使用 JSON.parse() 而不是 JSON.stringify?

您可能会在此处获得有关差异的更多信息: Difference between JSON.stringify and JSON.parse

【讨论】:

是的,使用 JSON.parse 我在服务器中有一个错误:( 感谢@Denis Kovzelyuk,但如果我尝试返回 JSON.parse(resolve) 就会出错。我已经用错误编辑了我的原始帖子。发生了什么?

以上是关于如何从 MySQL 查询中将 json 返回到 GraphQL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 mysql npm 的查询中将 *array of objects* 从 MySQL 返回到 Node js 服务器?

如何在node.js中将mysql查询的结果输出为json文件

如何在nodeJS的mysql查询中将值推送到数组?

我如何通过nodejs返回获取mysql json

如何在 web 服务响应中将 json 响应作为块返回?

在 Perl 中将 MySQL 结果作为哈希表返回