Loopback.js-回调已调用错误

时间:2019-07-18 16:47:57

标签: node.js async-await loopbackjs

我正在回环api中创建一个端点,我想返回不同的查询结果。这就是我所做的:

Model.datosPrincipalesPorId = (id, res, cb) => {
parameterValidatorId(id, err => {
  if (err) {
    logErr(
      '[ ' +
        new Date().toString() +
        ' ] :' +
        " --RESOURSE: '/api/establecimientos/ofertas/:id'" +
        ' --ERROR: ' +
        JSON.stringify(err)
    );
    res.status(httpStatus.BAD_REQUEST.code).send(err);
  }
});
const niveles = ['Inicial', 'Primario', 'Secundario'];
const conn = Model.app.datasources.db.connector;
let ofertas = [];
let sql;

niveles.forEach(nivel => {
  let oferta = { nivel: nivel };
  sql = sqlEstablecimiento.findIdiomas
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      console.log(stb);
      oferta.idiomas = stb;
      return oferta;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findModalidades
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.modalidades = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findTurnos
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.turnos = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findEspecializacionesIdioma
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.e_idiomas = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findIntensificacionesIdioma
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.i_idiomas = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findJornadas
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.jornadas = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findInformacionExtra
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.extra = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findReligiones
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.religiones = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findOrientaciones
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.orientaciones = stb;
    })
    .catch(err => cb(err, null));

  sql = sqlEstablecimiento.findSuborientaciones
    .replace('%1', id)
    .replace('%2', nivel);
  commons
    .getResultSqlString(conn, sql)
    .then(stb => {
      oferta.suborientaciones = stb;
    })
    .catch(err => cb(err, null));

  ofertas.push(oferta);
});
cb(null, ofertas);
};

在查询可以检索任何信息之前,似乎已执行了代码。每个查询都使用一个SQL字符串(正在运行),并调用此方法来执行它:

exports.getResultSqlString = (conn, sql, params) => {
  return new Promise((resolve, reject) => {
    conn.execute(sql.toString(), params, (err, result) => {
      if (err) reject(err);
      else resolve( result.map(item => { return {...item} }) );
    });
  });
};

我尝试不使用Promises来直接执行查询,但这不起作用:

conn.execute(sql.toString(), (err, result) => {
  if (err) return(res.status(httpStatus.BAD_REQUEST.code).send(err););
  else return( result.map(item => { return {...item} }) );
});

我不了解环回处理诺言的方式以及如何包含await运算符。

0 个答案:

没有答案