我正在使用Typescript
和export async function list_products(req: product.list_normal.Request):promise<product.list_normal.Response> {
// no need to check login here
....
return products;
}
export async function pay(req: shop.pay.Request): promise<shop.pay.Response> {
const isLogin = this.session && this.session.userInfo && this.session.userInfo.userId;
// check login here
if (!isLogin) {
return {
errorId: "need_login.error",
errorDesc: "please login"
}
}
...
return resp
}
来实现许多api,但在某些api中,我需要检查用户是否登录,我喜欢这样:
function need_login(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) {
let originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
const req = args[0]
if (!req.factoryUserId) {
return {
errorId: "need_login_error",
errorDesc: "please login",
}
} else {
let result = originalMethod.apply(this, args); // run and store the result
return result; // return the result of the original method
}
};
return descriptor;
}
export async function list_products(req) {
....
return products;
}
@need_login
export async function pay(req) {
...
return resp
}
问题是我每次都需要这样做,我想要这样的事情:
need_login
正如您所看到的,我在pay
方法中添加了一个装饰器Typescript
,这应该很棒,但Decorators are not valid here
装饰器无法在函数中使用:
{{1}}
所以我问我有没有选择轻松做到这一点?
答案 0 :(得分:0)
您可以使用中间件轻松实现此目的。例如,如果使用koa-router,则可以设置2个不同的路由器,一个用于公共路由,另一个用于经过身份验证的路由。例如:
koa = require('koa');
KoaRouter = require('koa-router');
app = koa();
publicRouter = new KoaRouter();
publicRouter.get('/products', httpTier.getProducts);
app.use(publicRouter.routes());
privateRouter = new KoaRouter({prefix: '/private'});
privateRouter.use(need_login);
privateRouter.post('/checkout', httpTier.pay);
app.use(privateRouter.routes());
因此,所有以&#34; / private&#34;开头的路线将需要使用need_login中间件进行身份验证。