【问题标题】:Using Crypto.js in meteor在流星中使用 Crypto.js
【发布时间】:2013-07-26 21:18:46
【问题描述】:

我正在尝试在一个流星 js 应用程序(流星版本 0.6.4.1)中包含一些 crypto.js 库。

当我将内容复制并粘贴到 server/main.js 文件中时,它可以正常工作,但这使得它非常不可读。

当我将库放在服务器目录中的单独文件中时(我也尝试将它们放在 lib 目录中)我收到错误 ReferenceError: CryptoJS is not defined

server/main.js 的要点:

Meteor.methods({
    encrypt:function(bundleID){
        return CryptoJS.HmacSHA256(string, 'something');
    }
});

我还尝试将 hmac-sha256.js 文件的第一行从

var CryptoJS=CryptoJS||function(h,s){...

到:

CryptoJS=CryptoJS||function(h,s){...

使其全球化,但这也不起作用。如何正确包含此库?

【问题讨论】:

    标签: javascript include global-variables meteor


    【解决方案1】:

    在您的应用程序目录中创建文件夹“packages/cryptojs”并放置文件:

    • hmac-sha256.js
    • enc-base64-min.js
    • package.js

    packages/cryptojs/package.js

    Package.describe({
      summary: "CryptoJS"
    });
    
    Package.on_use(function (api, where) {
      api.add_files(['hmac-sha256.js'], ['client','server']);
      api.add_files(['enc-base64-min.js'], ['client','server']);
    });
    

    您需要修改 hmac-sha256.js,将第 7 行的开头更改为:

    var CryptoJS=CryptoJS||function(h,s){
    

    到:

    CryptoJS=function(h,s){
    

    之后就可以使用了:

    var hash = CryptoJS.HmacSHA256("Message", "secret");
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);    
    console.log(hashInBase64)
    

    Example source

    【讨论】:

    • 所以这确实在本地工作,但是当我最终推送到 heroku(使用此构建包:github.com/v8squirrel/heroku-buildpack-meteor)时,应用程序崩溃并出现此错误:ReferenceError: Package is not defined。当我将加密文件的内容粘贴到 server.js 文件的底部时,它确实在 heroku 上运行。
    【解决方案2】:

    我按照 parhelium 的指南进行操作,但仍然无法正常工作,然后我找到了解决此问题的新方法: 只需将 hmac-sha512.js 中的第 7 行替换为这一行即可全球化 CryptoJS 对象:

    this.CryptoJS=this.CryptoJS

    为其他 cryptojs 修复相同的问题。要与 Base64 一起使用,您必须确保在其他库之后加载 base64.js。

    【讨论】:

      【解决方案3】:

      发生这种情况的原因是由于流星中的变量范围。尝试将 cryptojs 库文件放在 /server/compatibility 中。这样cryptojs库就可以在其他文件中访问了。

      您也可以通过删除 cryptojs 源文件中使用的 var 来使其工作,而无需将其放入 /compatibility。问题是,如果您这样做,就更难使文件保持最新状态。

      【讨论】:

      • 将它们放在/server/compatibility 中不起作用。文档只提到/client/compatibility(也在那里尝试过,没有用)。也许这对两者都不起作用?
      • 试试/compatibility 看看是否有效?在每个 JS 文件中从 var CryptoJS 中删除 var 怎么样?
      猜你喜欢
      • 2012-06-03
      • 2014-01-11
      • 2013-04-07
      • 2015-01-20
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 2018-03-03
      相关资源
      最近更新 更多