2016-06-20 12 views
0

Я использую koa и Typescript для реализации многих APIs, но в некоторых APIs, мне нужно проверить, если пользователь Логин, я так:как проверить правильность входа в систему перед действием?

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 
} 

, как вы можете видеть, я добавить декоратор need_login в pay методе, это должно быть большим, однако Typescript декоратор не может использовать в функции:

Decorators are not valid here 

Поэтому я прошу ли у меня выбор, чтобы сделать это легко?

ответ

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

Таким образом, все маршруты, начиная с «/ частным» потребует аутентификацию с использованием need_login промежуточного ПО.