我将使用以下信息创建一个钩子文件,即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适用于我所有的更新方法?即使我不打电话呢?
请帮助。
答案 0 :(得分:1)
app.hooks
注册了一个application level hook,它可以为所有服务运行。如果只希望将其用于特定服务和方法,则必须为app.service('users').hooks()
。