2017-02-01 10 views
0

Так что я немного застрял здесь.pg-agreement transaction response

У меня есть объект, такой как:

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

теперь, что мне нужно сделать, это цикл через это в транзакции пг-обещание SQL, чтобы гарантировать, что элемент строки в количестве базы данных для соответствующего идентификатора > = элементы объекта, так:

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 результатов, то объект верно, и я смог вставить запрос с

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] } ] ] 

любые идеи?

+0

Когда вы используете это: 'this.one (sql, pquery)' вы создаете запросы, каждый из них ожидает ровно одну строку назад, но по крайней мере одна из них возвращает более одной строки, следовательно, ошибка «Несколько строк не ожидались. '. См. API метода, это все. –

ответ

1

Когда вы задаете слишком много вопросов сразу, вы, вероятно, столкнетесь с несколькими ошибками посредине. Попробуйте решить одну проблему за раз.


В коде есть, по крайней мере, 5 проблемы, по-видимому ...

Проблема 1

При использовании этого: this.one(sql, pquery) создавать запросы каждый ожидает ровно один ряд назад, но по крайней мере один из них возвращает более одной строки, следовательно, ошибка Multiple rows were not expected.. См. method's API, это все.

Задача 2

Вы использовать функцию checkInventory генерировать массив обещаний, который хорошо, но затем вместо того, чтобы передать его в метод batch непосредственно, вы batch([checkInventory]), что приводит к batch([[promises]]), который Безразлично Из-за этого не получится.

Задача 3

используется checkInventory, а не функция, которая является недействительным. Вы должны позвонить batch(checkInventory()).

Задача 4

Вы, очевидно, не показывают полный код, а где-то не цепь обещаний вы создаете, что приводит к рыхлых обещаниям, а затем Unhadled promise rejection в конце концов.

Задача 5

Некоторые из значений, проходящих по product_id недействительны, следовательно, ошибка на уровне сервера об этом.

+0

Thanx Vitaly - Я не понимаю, о чем вы говорите, вместо того, чтобы передавать его в метод '' 'batch''', потому что я не понимал, что делаю это неправильно. можете ли вы дать мне пример того, как передать его в пакет метода непосредственно? –

+0

Вы должны передать массив обещаний, но вместо этого вы передаете массив массивов обещаний. –

+0

Да, я просто понимаю, что :) Мне нужно передать: SELECT * FROM inventory a = $ 1 AND b> = $ 2, [[1,10], [2,15], [4 , 22]] –