如何将结果从回送findById方法推入ctx.result

时间:2019-02-27 09:35:45

标签: javascript loopbackjs loopback

我能够从findById函数内部推送结果,并且日志也可以正确打印,但是在forEach循环之外,它只是空的。我确实尝试过使用诺言,但这也行不通。

let finalData = [];
Model.afterRemote('find', function(ctx, instance, next) {
  if (ctx.result) {
    if (Array.isArray(ctx.result)) {
      ctx.result.forEach(function(result) {
        Model.findById(result.id, {
            include: {
              relation: 'users',
              scope: {
                fields: ['email']
              }
            }
          },
          function(err, response) {
            finalData.push(response);
            console.log(finalData); // has the user information
          });
      });
    }
    ctx.result = finalData;
    console.log(ctx.result); // --> empty result (need the finalData result)
  }
  next();
});

2 个答案:

答案 0 :(得分:0)

您需要阅读异步功能和命令顺序。

尽管我认为您可以对您的API进行不同的查询以实现所需的功能。

但是无论如何,我会这样调用您的函数:

Model.afterRemote('find', function(ctx, instance, next) {
  let finalData = [];
  if (ctx.result) {
    if (Array.isArray(ctx.result)) {
      // map your results to array of id's
      const ids = ctx.result.map(res => res.id);
      // get result with different search query
      const response = await Arscenes.find({where: {id: {inq: ids}}}, {
          include: [{
            relation: 'users',
            scope: {
              fields: ['email']
            }
          }]
        });
        // put the reuslts in ctx.result
      ctx.result = response;
      // call next() to end the call
      next();
    }
  } else {
    // call next() to end the call only in else case, in your example you're calling that before anything else so the request is over
    next();
  }

});

答案 1 :(得分:0)

为什么不使用过滤器调用远程方法?您的方式带来了效率非常低的N + 1个查询。您无需在用例中实现afterRemote。在API调用中使用以下过滤器:

{
  "include": {
    "relation": "users",
    "scope": {
      "fields": ["email"]
    }
  }
}