为什么在所有更新服务方法中都调用Hook

时间:2020-07-27 00:34:34

标签: node.js hook feathersjs feathers-hook

我将使用以下信息创建一个钩子文件,即Hooks.js。 Hooks.js正在努力在需要JWT时对动作进行身份验证,我不需要在所有服务调用中都使用它。

据我了解,调用钩子的语法是app / use route / hooks,这些钩子仅应用于特定的路由,而不是全局的。

module.exports = {
  errorHandler: (context) => {
    if (context.error) {
      context.error.stack = null;
      return context;
    }
  },
  isValidToken: (context) => {
    const token = context.params.headers.authorization;  
    const payload = Auth.validateToken(token);
    console.log(payload);
    if(payload !== "Invalid" && payload !== "No Token Provided"){
        context.data = payload._id;
    }
    else {
        throw new errors.NotAuthenticated('Authentication Error Token');
    }
  },
  isValidDomain: (context) => {
    if (
      config.DOMAINS_WHITE_LIST.includes(
        context.params.headers.origin || context.params.headers.host
      )
    ) {
      return context;
    }
    throw new errors.NotAuthenticated("Not Authenticated Domain");
  },
  normalizedId: (context) => {
    context.id = context.id || context.params.route.id;
  },
  normalizedCode: (context) => {
    context.id = context.params.route.code;
  },
};

然后,我为服务和路线创建一个文件,如下所示:

const Hooks = require("../../Hooks/Hooks");
const userServices = require("./user.services");

module.exports = (app) => {
  app
    .use("/users", {
      find: userServices.find,
      create: userServices.createUser,
    })
    .hooks({
      before: {
        find: [Hooks.isValidDomain],
        create: [Hooks.isValidDomain],
      },
    });

  app
    .use("/users/:code/validate", {
      update: userServices.validateCode,
    })
    .hooks({
      before: {
        update: [Hooks.isValidDomain, Hooks.normalizedCode],
      },
    });

  app
    .use("/users/personal", {
      update: userServices.personalInfo,
    })
    .hooks({
      before: {
        update: [Hooks.isValidDomain, Hooks.isValidToken],
      },
    });
};

为什么Hooks.isValidToken适用于我所有的更新方法?即使我不打电话呢?

请帮助。

1 个答案:

答案 0 :(得分:1)

app.hooks注册了一个application level hook,它可以为所有服务运行。如果只希望将其用于特定服务和方法,则必须为app.service('users').hooks()