0

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

据我了解,调用钩子的语法是应用程序/使用路由/钩子,这些钩子仅适用于特定路由,而不是全局。

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 适用于我的所有更新方法?即使我不打电话?

请帮忙。

4

1 回答 1

1

app.hooks注册一个为所有服务运行的应用程序级挂钩。如果您只希望它用于特定的服务和方法,它必须是app.service('users').hooks().

于 2020-07-27T15:41:09.823 回答