pg-promise交易响应

问题描述 投票:0回答:1

所以我有点卡在这里。

我有一个对象,例如:

var lineItems = [
    {
      id: 1,
      quantity: 10
    },
    {
      id: 2,
      quantity: 15
    },
    {
      id: 4,
      quantity: 22
    }
]

现在我需要做的是在pg-promise SQL事务中循环这个,以确保关联id的数据库数量中的行项是> =对象项,所以:

SELECT * FROM inventory WHERE id = $1 AND quantity >= $2, [1,10],
SELECT * FROM inventory WHERE id = $1 AND quantity >= $2, [2,15],
SELECT * FROM inventory WHERE id = $1 AND quantity >= $2, [4,22]

如果我收到3个结果,那么该对象为true,我可以插入请求

INSERT INTO orders SET a = 1, b = 2, c = 3, items = lineItems::json etc RETURNING id;

当然,如果我的结果比lineItems对象少,那么我不打扰INSERT语句,只需返回一个'item id: 4, quantity:22 doesn't have enough inventory to perform your request...

我最初使用的是:

db.tx(function(t)){
  return this.batch([
    checkInventory
  ])
    .then(function(inv){
      console.log( inv );
    });
})
.then(function(results){
  console.log( results );
})
.catch(function(error){
  console.log( error );
});

其中checkInventory是我所称的功能

var checkInventory = function(){
    console.log( '|-------------------------------------|' );
    console.log( 'LINE ITEMS >> ', lineItems );
    var query = [], sql = ''; 
    for( var i = 0; i < lineItems.length; i++ ){
        sql += 'SELECT quantity FROM pim_inventory WHERE';
        sql += ' product_id = $1 AND quantity >= $2;';

        var pquery = [
            lineItems[i].id,
            lineItems[i].quantity
        ];

        query.push(this.one(sql, pquery));
    }

    console.log( 'invQUERY >> ', query );
    return query;
};

这会产生以下错误:

(node:44810) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): QueryResultError: Multiple rows were not expected.
(node:44810) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): error: syntax error at or near "product_id"
|-------------------------------------|
EVENTS >>  [ [ Promise {
      <rejected> QueryResultError: Multiple rows were not expected.
        at QueryResultError.Error (native)
        at new QueryResultError (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg-promise/lib/errors.js:13:22)
        at Query.callback (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg-promise/lib/index.js:629:38)
        at Query.handleReadyForQuery (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg/lib/query.js:89:10)
        at Connection.<anonymous> (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg/lib/client.js:163:19)
        at emitOne (events.js:101:20)
        at Connection.emit (events.js:188:7)
        at Socket.<anonymous> (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg/lib/connection.js:109:12)
        at emitOne (events.js:96:13)
        at Socket.emit (events.js:188:7) },
    Promise { <rejected> [Object] } ] ]

有任何想法吗?

node.js postgresql pg-promise
1个回答
2
投票

当你一次提出太多问题时,你可能会遇到多个错误。尝试一次解决一个问题。


在您的代码中至少存在5个问题,显然......

问题1

当你使用这个:this.one(sql, pquery)你创建请求时,每个都只需要一行,但至少有一行返回多行,因此错误Multiple rows were not expected.。看到method's API,它就在那里。

问题2

你使用你的函数checkInventory生成一个promises数组,这很好,但是然后你没有直接将它传递给方法batch,而是执行batch([checkInventory]),这导致batch([[promises]]),因为它没有得到解决。

问题3

你使用checkInventory而不是一个无效的函数。你应该打电话给batch(checkInventory())

问题4

你显然没有显示完整的代码,因为你没有链接你创建的承诺,这导致松散的承诺,然后Unhadled promise rejection最终。

问题5

您为product_id传递的某些值无效,因此有关它的服务器级错误。

© www.soinside.com 2019 - 2024. All rights reserved.