Pg-promise:交易问题

我用pg-promise与发生器交易得到了一些奇怪的东西。
这就是我要的 :

  1. 获取或注册一个用户(getOrRegisterUser)
  2. 做批次的东西(4插入发生器)
  3. 最后,使用getOrRegisterCurrentParkingIfProvided生成器的最后一个插入(发生器registerCall)

这是我的代码:

db.tx(function (t) { return t.task.call(params, getOrRegisterUser).then(function (user) { params.masterId = user.id; // NOTICE : MY USER ID DATABASE return t.batch([ t.task.call(params, registerNewPhones), t.task.call(params, registerNewPlate), t.task.call(params, registerNewSubscriptions), t.task.call(params, getOrRegisterCurrentParkingIfProvided) ]).then(function (result) { params.ParkingId = (result[3] !== undefined) ? result[3].id : null; return t.task.call(params, registerCall); }) }); }).then(function () { // job done resolve(); }).catch(function (err) { console.log(err); reject(err); }); 

我在第二个生成器(registerNewPhones)得到这个错误信息:

 severity: 'ERREUR', code: '23503', detail: 'La clé (customer)=(3) n\'est pas présente dans la table « users ».', 

任何方式来解决这个问题? 我尝试这样的交易: https : //github.com/vitaly-t/pg-promise#nested-transactions或https://github.com/vitaly-t/pg-promise#synchronous-transactions但有一些未知的情况我仍然在某处出错。

谢谢

PS:我知道这些发电机的实施是不是有罪,所以…

编辑:如果你真的想看到代码

 let squel = require('squel'); // squel with PostgresSQL syntax let squelPostgres = squel.useFlavour('postgres'); 

registerNewPhones:

 // Register all new phones numbers for user function * registerNewPhones(t) { let params = t.ctx.context; let findPhonesForUserQuery = squelPostgres .select() .from("HELPDESK.phones") .field("number") .where("customer = ?", params.masterId) .toString(); let registerPhoneForUser = squelPostgres .insert() .into("HELPDESK.phones") .set("customer", params.masterId); // find the already known phone number(s) for this user return t.any(findPhonesForUserQuery).then(function (result) { // data let phones = (params.hasOwnProperty("phones") ? params.phones : []); let alreadyRegisteredPhones = result.map(function (element) { return element.number; }); // filter data let phonesToRegister = phones.filter(function (aPhoneNumber) { return alreadyRegisteredPhones.indexOf(aPhoneNumber) == -1; }); // create queries let queries = phonesToRegister.map(function (phone) { return db.none( registerPhoneForUser .clone() .set("number", phone) .toString() ); }); return t.batch(queries); }); } 

和生成器getOrRegisterUser:

 function * getOrRegisterUser(t) { let params = t.ctx.context; // QUERIES: let findUserQuery = squelPostgres .select() .from("HELPDESK.users") .field("id") .where("registered_id = ?", params.userId) .toString(); let insertUserQuery = squelPostgres .insert() .into("HELPDESK.users") .setFields({ name: params.userName, registered_id: params.userId, typeOfAccount: 'BASIC', email: params.email }) .returning('id') .toString(); let user = yield t.oneOrNone(findUserQuery); return yield user || t.one(insertUserQuery); } 

这个问题在ES6-Generator函数registerNewPhones

 return t.any(findPhonesForUserQuery)... 

它不会yield承诺结果,这是ES6 Generator函数所需的。

即它必须是:

 return yield t.any(findPhonesForUserQuery)...