【问题标题】:Electron Amplify AppSync "Realtime disabled when in a server-side environment"Electron Amplify AppSync \“在服务器端环境中实时禁用\”
【发布时间】:2023-01-01 16:35:34
【问题描述】:

我在我的 Electron 应用程序中使用 amplify appsync,除了实时事件外,所有的工作都正常,这意味着当云中的数据发生变化时,我的应用程序不会收到信号。

我知道这是因为它在 Node 中运行,这正是 amplify 正在寻找的 (JS.browserOrNode) 但是我不知道如何修复它。有人可以告诉我如何获得实时更新吗?当我查询时,它只会获取本地数据,除非我使用 Datastore.stop() 和 Datastore.start() 但肯定有更好的方法吗?

先感谢您!

【问题讨论】:

  • 你试过amplify api gql-compile然后amplify codegen,也许你没有更新你的架构
  • 感谢@Ifaruki 的回复,一切设置正确,只是电子阻挡了它,请在下面查看我的回答:)

标签: javascript node.js electron aws-amplify aws-appsync


【解决方案1】:

感谢 amplify 团队对此不和谐,在 amplify-js 中,浏览器与节点检查的逻辑是:

const browserOrNode = () => {
    const isBrowser =
        typeof window !== 'undefined' && typeof window.document !== 'undefined';
    const isNode =
        typeof process !== 'undefined' &&
        process.versions != null &&
        process.versions.node != null;

    return {
        isBrowser,
        isNode,
    };
};

Datastore 逻辑确定它是要吐出警告还是开始订阅:

if (isNode) {
    logger.warn(
        'Realtime disabled when in a server-side environment'
    );
} else {
    //#region GraphQL Subscriptions
    [
        // const ctlObservable: Observable<CONTROL_MSG>
        ctlSubsObservable,
        // const dataObservable: Observable<[TransformerMutationType, SchemaModel, Readonly<{
        // id: string;
        // } & Record<string, any>>]>
        dataSubsObservable,
    ] = this.subscriptionsProcessor.start();
}

但是因为 Electron 在 Node.js 环境中运行应用程序,这就是 DataStore 禁用实时的原因。

您可以通过强制 isNode 为假来停止它,然后实时与电子一起工作:)

【讨论】:

  • 但是如果我需要节点集成怎么办?
  • 这只是允许实时放大的设置,它不会改变应用程序中的任何其他内容@Lance
  • 我怎样才能“强迫”它是假的?你分叉回购了吗?
  • 不,我修补了它@margincall! See here
【解决方案2】:

感谢@S.Mac,

关于 S.Mac 的更多说明回答了我是如何修复我的问题的。

“节点版本”:“v19.2.0”, “npm 版本”:“9.2.0”, “aws-放大”:“^5.0.4”, “补丁包”:“^6.5.0”

  1. 打开 package.json 并将 "postinstall": "patch-package" 添加到 script

  2. 安装补丁包npm i patch-packagenpm i --save-dev patch-package 如果你比较喜欢

  3. 打开“node module/@aws-amplify/core/lib-esm/JS.js”并向下滚动到

    export var browserOrNode = function(){} 并将所有语句替换为

        return {
        isBrowser: true,
        isNode: false,
    };
    
  4. 打开“node_modules/@aws-amplify/core/src/JS.ts”并找到 export const browserOrNode = () =&gt; {} function 如果您使用的是 TS 并将语句更改为:

       const isBrowser = true;
       const isNode = false;
    
       return {
         isBrowser,
         isNode,
       };
    
  5. 最后,使用npx patch-package aws-amplify 将软件包修补回来,确保您已连接到互联网,我不知道为什么。

    希望这对某人和我有帮助。

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 2022-12-29
    • 1970-01-01
    • 2021-12-22
    • 2022-06-22
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多