我在试用GraphQL。我从postgresql中提取数据,除了一个问题,解析在查询完成之前就完成了,其他一切似乎都能正常工作。我以为我的查询承诺工作正常。这里是我为查询数据库而创建的类:
class PgPoolClient {
constructor(options) {
this.connection = options.connection;
}
query(sql, data = []) {
return new Promise((resolve, reject) => {
var pool = new pg.Pool(this.connection);
pool.connect((err, client, done) => {
if (err) {
reject({
code: 505,
message: err.message,
entrys: []
});
} else {
client.query(sql, data, (err, results) => {
done();
if (err) {
reject({
code: 404,
message: err.message,
entrys: []
});
} else {
resolve({
code: 200,
message: "ok",
entrys: results
});
}
});
}
});
pool.on("error", (err, client) => {
reject({
code: 505,
message: err.message,
entrys: {}
});
});
});
}
}
下面是我的graphql查询:
const Query = new GraphQLObjectType({
name: 'Query',
description: 'Root query object',
fields: () => ({
accounts: {
type: new GraphQLList(Account),
resolve(root, args) {
const parameters = [];
pg.query(`SELECT
id, token, user_identifier as userIdentifier, hash_password as hashPassword,
is_enabled as isEnabled, security_type_id as securityTypeID,
is_admin as isAdmin, ad_path as adPath, date_created as dateCreated,
date_modified as dateModified, modified_by as modifiedBy
FROM accounts.account`, parameters)
.then((result) =>
{
console.log(result.entrys.rows);
//return result.entrys.rows;
return [
{
id: '33333',
token: '111',
userIdentifier: 'test'
}
]
})
.catch((err) =>
{
console.log(err);
return err.message;
});
console.log('finished');
}
})
});
我注释了我的结果,只是想了解一下返回静态内容的情况,结果似乎在then()内时不会返回到graphisql(这意味着在then()之前完成的解析)。输出:
{
"data": {
"accounts": null
}
}
我可以通过将静态返回数组放在console.log(“finished”)下面来验证这一点,它可以正确地返回数据。
console.log('finished');
return [
{
id: '33333',
token: '111',
userIdentifier: 'test'
}
]
显示在GraphiQL中:
{
"data": {
"accounts": [
{
"id": "33333",
"token": "111",
"userIdentifier": "test"
}
]
}
}
看来我的诺言没有得到兑现。是不是我的查询函数中缺少了什么东西,导致解析不等待我的结果?如有任何帮助,我们将不胜感激。
更新1
如果我将查询包装在一个承诺中,它似乎会起作用:
return new Promise((resolve, reject) => {
pg.query(`SELECT
id, token, user_identifier as userIdentifier, hash_password as hashPassword,
is_enabled as isEnabled, security_type_id as securityTypeID,
is_admin as isAdmin, ad_path as adPath, date_created as dateCreated,
date_modified as dateModified, modified_by as modifiedBy
FROM accounts.account`, parameters)
.then((result) =>
{
console.log(result.entrys.rows);
//return result.entrys.rows;
resolve( [
{
id: '33333',
token: '111',
userIdentifier: 'test'
}
]);
})
.catch((err) =>
{
console.log(err);
reject(err.message);
});
我猜我的问题是,如果我的查询功能已经包装在一个承诺中,为什么我还要再做一次呢?
您的resolve
函数需要返回承诺。当您将它显式包装在一个承诺中时,它工作了,因为您返回了它。如果您返回调用pg.query
的结果,那么它应该可以在没有该功能的情况下工作。
const Query = new GraphQLObjectType({
name: 'Query',
description: 'Root query object',
fields: () => ({
accounts: {
type: new GraphQLList(Account),
resolve(root, args) {
const parameters = [];
return pg.query(`query`, parameters)
.then((result) =>
{
console.log(result.entrys.rows);
//return result.entrys.rows;
return [
{
id: '33333',
token: '111',
userIdentifier: 'test'
}
]
})
.catch((err) =>
{
console.log(err);
return err.message;
});
console.log('finished');
}
})
});
问题内容: 我找不到关于Returning子句的等效解决方案 我在SQLAlchemy中做到了: 我需要在执行DELETE语句时返回item_id,sub_item_id集。 问题答案: 要按原样执行查询,请使用Core构造:
问题内容: 我正在尝试创建一种方法,从中可以查询数据库并检索整个表。 目前,如果我使用这些数据只是正常工作 中 的方法。但是,我希望该方法返回结果。 我正在了解当前代码。 我该如何实现? 问题答案: 您永远不要通过公共方法来回避。这很容易导致资源泄漏,因为您不得不保持语句和连接打开。关闭它们将隐式关闭结果集。但是,将它们保持打开状态将导致它们悬而未决,并且当它们打开过多时,将导致数据库用尽资源。
本文向大家介绍Dapper.NET 执行不返回任何结果的命令,包括了Dapper.NET 执行不返回任何结果的命令的使用技巧和注意事项,需要的朋友参考一下 示例
我有一个简单的代码,可以从第14列开始将转置的范围复制到另一张表的最后一行 它按原样返回零结果。如果我将destrow从公式更改为simple 2(这是现在最后一个空行),则效果很好。为什么不返回目标工作表中的最后一行索引?
我正在尝试处理新的AndroidLollipopMediaProjection API。 我发现(至少在我的股票三星Galaxy S4 jfltexx上),当我开始意图获取捕获屏幕的权限()时,除非我在前面的尝试中选中了“不要再次询问”,否则在中不会有结果... 和结果处理: 权限对话框显示得很好,但是我的活动被隐藏了,它永远不会转到。 知道出什么问题了吗?
虽然运行与SQL查询相同的查询并获取结果,但在ifCurrent中未获取任何结果。 我是否传递了错误的参数? 这就是在学校里通过的