Pg-promise:链接条件查询
Pg-promise: chaining conditional queries
我正在尝试找到链接条件查询的正确方法。
下面是一些伪代码来说明我的情况:
check whether the an item exists;
if no:
reply with status 404;
if yes:
check whether the user owns the item;
if no:
redirect to another page;
if yes:
retrieve the information about the item and render the page;
我的第一直觉是使用 tasks 来重用相同的连接,但由于可能的结果不同,我很难弄清楚如何正确处理承诺:
db.task(t => {
return t.items.exists(itemId)
.then(exists => {
if (!exists) { // item does not exist
// 404
}
return t.items.isOwner(itemId, userId)
.then(isOwner => {
if (!isOwner) {
// redirect to some other page
}
return t.items.getById(itemId);
})
})
})
.then(data => {
// OK, process data and render
})
.catch(console.error); // unexpected errors
例如,如果我尝试重定向到 404 页面,承诺仍将在之后得到解决。
另一种方法是具有以下内容:
if (!exists) { // item does not exist
return Promise.reject('404');
}
...
.then(data => {
// OK, process data and render
}, reason => {
// KO, conditions were not met to resolve
})
which 'works',但同时捕获错误和未满足的条件。我希望有一个专用的 'unmet condition' 处理程序。
我想到的另一种方法:
var p = db.task(t => {
return t.items.exists(itemId)
.then(exists => {
if (!exists) { // item does not exist
// resolve p (and break promise chain) with something like
// p.resolve(() => {
// return res.redirect...
// });
}
// else we can go on with the queries
return t.items.isOwner(itemId, userId);
}
.then(isOwner => {
if (!isOwner) {
// resolve p and redirect to some other page
}
return t.items.getById(itemId);
})
.then(item => {
// everything OK, resolve with a handler to render the page
});
})
.then(action => {
action();
})
.catch(console.error); // unexpected errors
但我看不出有什么办法可以解决 p
。在嵌套的 promise 中调用 Promise.resolve(...)
会在落入 p
的 then
.
之前自行解析下一个 promise
在关注性能的同时,在 pg-promise
中链接条件查询和处理不同结果的推荐方法是什么?
看看这是否适合你。
这仍然需要项目通过每个承诺,直到它到达最后一个 then
区块或 catch
区块。
// First Condition
const input = 'test input'
Promise.resolve({ item: input })
// Repeat this for different condition on `item.item` and change `X`
/* REPEAT START */
.then(data => {
if (data.hitCondition != null && data.hitCondition !== '') {
return data;
}
if (conditionX(data)) {
return Object.assign({}, data, {
hitCondition: 'conditionX'
});
}
return data;
})
/* REPEAT END */
...
.then(result => {
const { item, hitCondition } = result
if (hitCondition != null && hitCondition !== '') {
// at least one condition is met
// check hitCondition to see which condition is hit
} else {
// none of the conditions are met
}
})
.catch(error => {
// Some error happened somewhere
console.error(error);
});
作者的问题主要在于使用 promise,而不是 pg-promise。
db.task('easy-peasy', async t => {
if (await t.items.exists(itemId)) {
// reply with status 404;
} else {
if (await t.items.isOwner(itemId, userId)) {
// redirect to some other page
} else {
return t.items.getById(itemId); // return the data
}
}
})
.then(data => {
if (data) {
// Task returned data;
// Render the data;
}
})
.catch(console.error); // unexpected errors
我正在尝试找到链接条件查询的正确方法。
下面是一些伪代码来说明我的情况:
check whether the an item exists;
if no:
reply with status 404;
if yes:
check whether the user owns the item;
if no:
redirect to another page;
if yes:
retrieve the information about the item and render the page;
我的第一直觉是使用 tasks 来重用相同的连接,但由于可能的结果不同,我很难弄清楚如何正确处理承诺:
db.task(t => {
return t.items.exists(itemId)
.then(exists => {
if (!exists) { // item does not exist
// 404
}
return t.items.isOwner(itemId, userId)
.then(isOwner => {
if (!isOwner) {
// redirect to some other page
}
return t.items.getById(itemId);
})
})
})
.then(data => {
// OK, process data and render
})
.catch(console.error); // unexpected errors
例如,如果我尝试重定向到 404 页面,承诺仍将在之后得到解决。 另一种方法是具有以下内容:
if (!exists) { // item does not exist
return Promise.reject('404');
}
...
.then(data => {
// OK, process data and render
}, reason => {
// KO, conditions were not met to resolve
})
which 'works',但同时捕获错误和未满足的条件。我希望有一个专用的 'unmet condition' 处理程序。
我想到的另一种方法:
var p = db.task(t => {
return t.items.exists(itemId)
.then(exists => {
if (!exists) { // item does not exist
// resolve p (and break promise chain) with something like
// p.resolve(() => {
// return res.redirect...
// });
}
// else we can go on with the queries
return t.items.isOwner(itemId, userId);
}
.then(isOwner => {
if (!isOwner) {
// resolve p and redirect to some other page
}
return t.items.getById(itemId);
})
.then(item => {
// everything OK, resolve with a handler to render the page
});
})
.then(action => {
action();
})
.catch(console.error); // unexpected errors
但我看不出有什么办法可以解决 p
。在嵌套的 promise 中调用 Promise.resolve(...)
会在落入 p
的 then
.
在关注性能的同时,在 pg-promise
中链接条件查询和处理不同结果的推荐方法是什么?
看看这是否适合你。
这仍然需要项目通过每个承诺,直到它到达最后一个 then
区块或 catch
区块。
// First Condition
const input = 'test input'
Promise.resolve({ item: input })
// Repeat this for different condition on `item.item` and change `X`
/* REPEAT START */
.then(data => {
if (data.hitCondition != null && data.hitCondition !== '') {
return data;
}
if (conditionX(data)) {
return Object.assign({}, data, {
hitCondition: 'conditionX'
});
}
return data;
})
/* REPEAT END */
...
.then(result => {
const { item, hitCondition } = result
if (hitCondition != null && hitCondition !== '') {
// at least one condition is met
// check hitCondition to see which condition is hit
} else {
// none of the conditions are met
}
})
.catch(error => {
// Some error happened somewhere
console.error(error);
});
作者的问题主要在于使用 promise,而不是 pg-promise。
db.task('easy-peasy', async t => {
if (await t.items.exists(itemId)) {
// reply with status 404;
} else {
if (await t.items.isOwner(itemId, userId)) {
// redirect to some other page
} else {
return t.items.getById(itemId); // return the data
}
}
})
.then(data => {
if (data) {
// Task returned data;
// Render the data;
}
})
.catch(console.error); // unexpected errors