FeathersJS - 链钩的位置?

时间:2018-02-01 08:01:08

标签: javascript node.js hook feathersjs

我有一个执行三个不同任务的功能,效果很好。为了更好的可重用性,我试图将它们分成三个独立的钩子。 它们看起来像这样:

module.exports = function(options = {}) {
  return function hookFunction(hook) {
  //do stuff and set variables
  function(hook.params.var){ ... } // only in second and third
  hook.params.var = var;           // only in first and second
    return Promise.resolve(hook);
  };
}; 

我的service.hook文件包含:

module.exports = {
  before: {
    find: [ firstHook(), secondHook(), thirdHook() ]}}

现在它们似乎同时运行,这导致第三个引发由第一个和第二个丢失数据引起的错误。我希望他们一个接一个地跑。我怎么能实现这一目标?

(我尝试在.then中使用service.hook,但会抛出TypeError: hookFunction(...).then is not a function。)

我已阅读How to run synchronous hooks on feathersjs但我不太清楚在哪里放置链接 - 在第三个钩子或服务钩子或其他地方?

1 个答案:

答案 0 :(得分:2)

Hooks将按照它们注册的顺序运行,如果它们返回一个promise(或者是async函数),它将等待该promise的解析。最常见的错误是,如果它们一次运行但应该按顺序运行,则不会返回任何承诺或错误的承诺,但是从代码示例中就不清楚是否是这种情况。以下示例将起作用并等待一秒,然后打印当前名称并移至下一个:

function makeHook(name) {
  return function(context) {
    return new Promise(resolve => {
      setTimeout(() => {
        console.log(`Running ${name}`);
        resolve(context);
      }, 1000);
    });
  }
}
module.exports = {
  before: {
    find: [ makeHook('first'), makeHook('second'), makeHook('third') ]}}