Loopback.js - 如何将多个参数传递给模型远程方法

Loopback.js - How do I pass multiple parameters to model remote method

我正在尝试更改只有一个参数 (id) 的 Idioma 模型的远程方法。这是实际运行的代码:

Model.remoteMethod('idiomaByOferta', {
  description: 'Obtener un idioma por oferta',
  http: { path: '/oferta/:id', verb: 'get' },
  accepts: [
    { arg: 'id', type: 'string', required: true },
    { arg: 'res', type: 'object', http: { source: 'res' } }
  ],
  returns: {
    type: 'Object',
    root: true,
    default: output_structure
  }
});

Model.idiomaByOferta = (id, res, cb) => {
  parameterValidatorId(id, err => {
    if (err) {
      res.status(httpStatus.BAD_REQUEST.code).send(err);
    }
  });
  const conn = Model.app.datasources.db.connector;
  commons
    .getResultSqlString(conn, sqlEstablecimiento.findIdiomas, [id])
    .then(stb => {
      cb(null, stb);
    })
    .catch(err => cb(err, null));
  };

Model.afterRemote('idiomaByOferta', async (ctx, result, next) => {
  delete ctx.res.req.query.limit;
  delete ctx.res.req.query.page;
  delete query.limit;
  delete query.page;
  next();
});

现在我想包含另一个参数,但我还没有找到使用所需参数的确切方法。我已经尝试了以下但它不起作用:

Model.remoteMethod('idiomaByOferta', {
  description: 'Obtener un idioma por oferta',
  http: { path: '/oferta', verb: 'get' },
  accepts: [
    { arg: 'id', type: 'string', required: true, http: { source: 'query' }},
    { arg: 'nivel', type: 'string', required: true, http: { source: 'query' }},
    { arg: 'res', type: 'object', http: { source: 'res' } }
  ],
  returns: {
    type: 'Object',
    root: true,
    default: output_structure
  }
});

请求url:{{url}}/api/idiomas/oferta?id={{oferta}}&nivel=Inicial

响应:

{
    "errors": [
        {
            "code": 938,
            "source": "id",
            "detail": "is not allowed"
        },
        {
            "code": 963,
            "source": "nivel",
            "detail": "is not allowed"
        }
    ]
}

我也试过这样做:

Model.remoteMethod('idiomaByOferta', {
  description: 'Obtener un idioma por oferta',
  http: { path: '/oferta/:id/nivel/:nivel', verb: 'get' },
  accepts: [
    { arg: 'id', type: 'string', required: true},
    { arg: 'nivel', type: 'string', required: true},
    { arg: 'res', type: 'object', http: { source: 'res' } }
  ],
  returns: {
    type: 'Object',
    root: true,
    default: output_structure
  }
});

请求超时,从未完成。

您的 accepts 属性的位置很重要。

在您的 http 属性中,参数 path 是可选的,如果您想更改 accepts 属性的顺序或只是修改路径名,则该参数很有用。

我会做的是:

Model.remoteMethod('idiomaByOferta', {
  description: 'Obtener un idioma por oferta',
  http: { path: '/oferta/:id/:nivel', verb: 'get' },
  accepts: [
    { arg: 'id', type: 'string', required: true },
    { arg: 'nivel', type: 'string', required: true},
    { arg: 'res', type: 'object', http: { source: 'res' } }
  ],
  returns: {
    type: 'Object',
    root: true,
    default: output_structure
  }
});

Model.idiomaByOferta = (id, nivel, res, cb) => { //add nivel here in second position
  parameterValidatorId(id, err => {
    if (err) {
      res.status(httpStatus.BAD_REQUEST.code).send(err);
    }
  });
  parameterValidatorId(nivel, err => {
    if (err) {
      res.status(httpStatus.BAD_REQUEST.code).send(err);
    }
  });
  const conn = Model.app.datasources.db.connector;
  commons
    .getResultSqlString(conn, sqlEstablecimiento.findIdiomas, [id, nivel]) //and use it there, maybe, depending on what your code is doing?
    .then(stb => {
      cb(null, stb);
    })
    .catch(err => cb(err, null));
  };