如何使用babel为我的js服务模块实现经过身份验证的es 7装饰器

How to implement an authenticated es 7 decorator with babel for my js service module

本文关键字:es 身份验证 经过 实现 babel 何使用 我的 js 模块 服务      更新时间:2023-09-26

我在我的flux fluxible js项目中使用了具有decorator stage:0支持的babel,我想为我的服务api模块使用经过身份验证的decorator来检查有效的用户会话。

在谷歌上搜索,似乎有几个帖子解释了不同的变体,但找不到一个明确的文档或说明。

这是我迄今为止所做的尝试,我知道我的已验证函数的参数是不正确的,并且不确定我是否需要为我的模块实现一个类,而不仅仅是使用exports对象。

我找不到文档的部分是如何实现decorator本身——在这种情况下,decorated函数将接收并检查req参数

// how do I change this method so that it can be implemented as a decorator
function checkAuthenticated(req) {
    if (!req.session || !req.session.username)
    {
        throw new Error('unauthenticated');
    }
}
module.exports = {
    @checkAuthenticated
    read: function(req, resource, params, serviceConfig, callback) {
        //@authenticated decorator should allow me to move this out of this here
        //checkAuthenticated(req);
        if (resource === 'product.search') {
            var keyword = params.text;
            if (!keyword || keyword.length === 0) {
                return callback('empty param', null);
            } else {
                searchProducts(keyword, callback);
            }
        }
    }
};
class Http{
  @checkAuthenticated
  read(req, resource, params, serviceConfig, callback) {
    if (resource === 'product.search') {
      var keyword = params.text;
      if (!keyword || keyword.length === 0) {
        return callback('empty param', null);
      } else {
        this.searchProducts(keyword, callback);
      }
    }
  }
  searchProducts(keyword, callback) {
    callback(null, 'worked');
  }
}
function checkAuthenticated(target, key, descriptor) {
    return {
      ...descriptor,
      value: function(){
        console.log(arguments);
        const req = arguments[0];
        if (!req.session || !req.session.username) {
            throw new Error('unauthenticated');
        }
        return descriptor.value.apply(this, arguments);
      }
    };
}
let h = new Http();
h.read(
  { session: { username: 'user' } },
  'product.search',
  { text: 'my keywords' },
  null,
  function(err, result) {
    if (err) return alert(err);
    return alert(result);
  }
);

参见jsbinhttp://jsbin.com/yebito/edit?js,控制台,输出