0

我试图弄清楚如何在构建 Web 应用程序时将基于浏览器的 aws-sdk.js 与 require.js 一起使用。

如果我尝试构建一个类并在 require.js 定义中包含 aws-sdk,一旦我尝试创建一个实例并引用 AWS 类,它就会说它是未定义的。

例如,我有一个函数可以检查凭证是否是 AWS.Credentials 的实例,如果不是,它会尝试使用通过 Rest 检索到的 STS 令牌对其进行初始化。问题是,代码在 if(this.credentials instanceof AWS.Credentials) 上死掉了,说 AWS 是未定义的。它甚至死于我对需求刷新的简单检查。

这就是我的定义的样子——我将包含“needsRefresh”包装器,作为引发未定义错误的例子:

define(['require','aws-sdk','jquery'],
    function (require, AWS, $) {

        // Aws helper class
        function AwsHelper() { };

        AwsHelper.prototype = {
            credentials: null,

            tokenNeedsRefresh: function () {
                //////////////////////////////////////////////////////////////////
                // errors out on the following line with:                       //
                //   TypeError: Cannot read property 'Credentials' of undefined //
                //////////////////////////////////////////////////////////////////
                if(this.credentials instanceof AWS.Credentials) {
                    return this.credentials.needsRefresh();
                } else return true;
            }
        };
        return AwsHelper;
    }
);

我还在文件顶部尝试了以下格式:

define(function (require) {
        var AWS = require("aws-sdk"),
            $ = require("jquery");
        /* .. */

如果我删除所有对正在运行的刷新代码的 onLoad 引用,它将加载并且我可以创建一个实例。但只要我调用任何引用 AWS 类的函数,它就会死掉。

生成实例后,如何确保 AWS 类定义仍在全局空间中?

不知道路径会有什么不同(它可以很好地查找和加载代码 - 我可以在调试器的命名空间中看到 AWS 类,因为它正在加载,但它不在函数调用的命名空间中),但根据请求添加:

requirejs.config({
    baseUrl: '/js',
    paths: {
        lib: 'lib',
        ImageUploader: 'ImageUploader'
    }
});
4

1 回答 1

0

我决定再次尝试玩这个,似乎已经弄清楚我是如何错误地处理它的。我还没有将它重新集成到我现有的代码设置中,但我认为我有一个可行的解决方案。

我做错的事情是我试图设置 AWS 类,以便我可以将它作为一个模块加载(这就是为什么我尝试按照 require.js 的建议包装它)。

这次玩它,我注意到了一些我以前没有注意到的东西。我有一个在本地范围内未定义的 AWS 和另一个在全局范围内保存类定义的 AWS。所以它试图在我的定义中指定 AWS 来创建本地“空”版本:

define(
    ["jquery","aws-sdk","dropzone","app/MyUtilities"],
    function ($, AWS, Dropzone, MyUtilities) {
        "use strict";
        function MyClass() {};
        return MyClass;
    }
);

jquery 和 dropzone 有确保它们以这种方式加载所需的一切,但 aws-sdk 似乎做了一些它自己的异步加载。因此函数中的作用域变量是未定义的。从技术上讲,似乎我唯一需要在函数包装器中定义为模块的是我自己的实用程序模块。因此,通过将其切换为:

define(
    ["app/MyUtilities","jquery","aws-sdk","dropzone"],
    function (MyUtilities) {
        "use strict";
        function MyClass() {};
        return MyClass;
    }
);

...似乎 $ 和 jquery 是根据需要定义的,Dropzone 是根据需要定义的,AWS 是根据需要定义的。(并且在访问静态 AWS.config 或 AWS.Credentials 定义时,我没有像以前那样收到错误)

于 2020-01-06T18:13:38.350 回答