2016-06-20 2 views
0

私は多くのAPIを実装するためにkoaTypescriptを使用していますが、いくつかのAPIで、私は、ユーザーがログインであるかどうかを確認する必要があり、私はこのように実行します。アクションの前にログインを検証する方法は?

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 
} 

問題は、私はそれぞれこれを実行する必要がということです時間が、私はこのような何かをしたい:あなたが見ることができるよう

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 
} 

が、私はpay方法でデコレータneed_loginを追加し、これは偉大である必要があり、しかしTypescriptデコレータは関数内で使用することはできません:

Decorators are not valid here 

私はこの簡単を行うための任意の選択肢を持っているんだから私はを求めていますか?

答えて

0

これは簡単にミドルウェアで実現できます。たとえば、koa-routerを使用する場合は、2つの異なるルーターを設定できます.1つはパブリックルート用で、もう1つは認証済みルート用です。例:

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()); 

したがって、「/ private」で始まるすべてのルートには、need_loginミドルウェアを使用した認証が必要です。

関連する問題