如何从 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 服务器?