与pg-promise的嵌套查询

我需要使用pg-promise进行查询,使用结果做出3个其他查询,但执行时出现这个错误:

未处理的拒绝types错误:方法'批'需要一个值的数组。 在C:\ apps \ pfc \ node_modules \ spex \ lib \ ext \ batch.js:149:26 at batch(C:\ apps \ pfc \ node_modules \ spex \ lib \ ext \ batch.js:61:26) Task.batch(C:\ apps \ pfc \ node_modules \ pg-promise \ lib \ task.js:120:39)…………..

这是我的代码:

db.task(t => { return t.one('select gid, idgrupo from orden where gid = $1', req.params.ordenid, resultado => { return t.batch([ t.one('select o.gid as num, v.matricula, v.denom, o.pkini, o.pkfin, o.fechaini, o.f_estimada, o.fechafin, o.idestado, o.descr, o.instr, g.id as idgrupo, g.nombre as grupo, g.actividad, e.descr as estado from orden as o inner join estado as e on o.idestado = e.gid inner join grupo as g on o.idgrupo = g.id inner join via as v on o.idctra = v.gid and o.gid = $1', resultado.gid), t.any('select * from operacion order by gid where idgrupo = $1', resultado.idgrupo), t.any('select m.gid, m.fechamed as fecha, m.cantidad, m.costemed as coste, o.codigo, o.descr from medicion m, operacion o where m.idorden = $1 and m.idope = o.gid order by fecha asc', resultado.gid) ]) .then(data => { res.render('mediciones/nuevaMed', { title: 'Crear / Modificar parte de trabajo', orden: data[0], operaciones: data[1], medicion: [], mediciones: data[2], errors: [] }); }).catch(function(error) {next(error);}); }).then(t.batch); }); 

我是pg-promise的作者。


您的代码有几个问题,如下所述…

  • 与方法一起使用的值转换callback用于转换返回的值。 即使技术上你可以回报一个承诺,但是从承诺的angular度来看,这会产生一个尴尬的代码。 我会build议不要那样做。

  • 将非数据库代码放入数据库任务中并不是一个很好的解决scheme,这会创build混合用途的代码,这些代码的维护方式更加困难,也被认为是反模式。

  • 而你最终得到的错误是因为你正在做的是批处理的结果,在你的代码中,这个结果是undefined ,将它传递给另一个批处理 ,显然不喜欢它,并抛出非常错误。 事情是,你根本不需要它。 你必须从需要的代码中复制,并把它放在不需要的地方:)

说了这么多,你的代码应该是这样的:

 db.task(t => { return t.one('select gid, idgrupo from orden where gid = $1', req.params.ordenid) .then(resultado => { return t.batch([ t.one('select o.gid as num, v.matricula, v.denom, o.pkini, o.pkfin, o.fechaini, o.f_estimada, o.fechafin, o.idestado, o.descr, o.instr, g.id as idgrupo, g.nombre as grupo, g.actividad, e.descr as estado from orden as o inner join estado as e on o.idestado = e.gid inner join grupo as g on o.idgrupo = g.id inner join via as v on o.idctra = v.gid and o.gid = $1', resultado.gid), t.any('select * from operacion order by gid where idgrupo = $1', resultado.idgrupo), t.any('select m.gid, m.fechamed as fecha, m.cantidad, m.costemed as coste, o.codigo, o.descr from medicion m, operacion o where m.idorden = $1 and m.idope = o.gid order by fecha asc', resultado.gid) ]); }); }) .then(data => { res.render('mediciones/nuevaMed', { title: 'Crear / Modificar parte de trabajo', orden: data[0], operaciones: data[1], medicion: [], mediciones: data[2], errors: [] }); }) .catch(next); 

使用ES6生成器语法时,它变得更简单:

 db.task(function* (t) { const resultado = yield t.one('select gid, idgrupo from orden where gid = $1', req.params.ordenid); const orden = yield t.one('select o.gid as num, v.matricula, v.denom, o.pkini, o.pkfin, o.fechaini, o.f_estimada, o.fechafin, o.idestado, o.descr, o.instr, g.id as idgrupo, g.nombre as grupo, g.actividad, e.descr as estado from orden as o inner join estado as e on o.idestado = e.gid inner join grupo as g on o.idgrupo = g.id inner join via as v on o.idctra = v.gid and o.gid = $1', resultado.gid); const operaciones = yield t.any('select * from operacion order by gid where idgrupo = $1', resultado.idgrupo); const mediciones = yield t.any('select m.gid, m.fechamed as fecha, m.cantidad, m.costemed as coste, o.codigo, o.descr from medicion m, operacion o where m.idorden = $1 and m.idope = o.gid order by fecha asc', resultado.gid); return {orden, operaciones, mediciones}; }) .then(data => { res.render('mediciones/nuevaMed', { title: 'Crear / Modificar parte de trabajo', orden: data.orden, operaciones: data.operaciones, medicion: [], mediciones: data.mediciones, errors: [] }); }) .catch(next);