如何在行动前验证登录?

时间:2016-06-20 09:42:23

标签: javascript typescript decorator koa

我正在使用Typescriptexport 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}}

所以我问我有没有选择轻松做到这一点

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中间件进行身份验证。