我正在编写一些knex查询,以检查在4个约束条件下提供的代码(也称为voucher
)是否合法。
我当前的代码(尽管尚未完成)如下:
export default () => (async (req, res) => {
const { eventId, orderId, voucher, left } = req.params;
const [{ code }, { eventId }, { expiryDate }, {quantity}] = await Promise.all([
knex('vouchers')
.where({
code: voucher
})
.first(),
knex('vouchers')
.where({
event_id
})
.first(),
knex('mv_vouchers')
.where({
voucher_id: code,
// 'left', > , 0,
})
.first(),
]);
if (code && eventId && expiryDate && quantity) {
await knex.insert([{order_id: orderId}, {voucher_id: voucher}], 'id').into('order_vouchers');
res.status(202).end();
} else{
res.status(404).end();
}
});
我担心的部分是分段的代码。我看到有人在某个地方在线使用此功能,但是我一生都无法在stackoverflow上找到它。在我的假设下,常量code
,eventId
等应全部返回true或false,然后可以在我的if逻辑中使用。这是正确的路线还是完全错误?
答案 0 :(得分:1)
首先,code
和eventId
仅应在该列的数据类型为布尔值时返回布尔值。要获取布尔值,您必须操纵每个查询的响应,例如通过检查响应中是否存在属性或向查询中添加case语句(会导致IMO混乱)。
第二,建议您不要使用与Promise.All()
结合使用的4个查询,而是按照以下内容移至单个查询(假设您无需明确知道查询的原因)响应无结果):
export default () => (async (req, res) => {
const { eventId, voucher } = req.params;
const response = await knex('vouchers')
.join('mv_vouchers', 'vouchers.id', 'mv_vouchers.voucherId')
.where('vouchers.code', '=', voucher)
.where('vouchers.event_id', '=', eventId)
.first()