我能够从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();
});
答案 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"]
}
}
}