0

我使用 nexus graphql 框架创建了超级简单的应用程序。

第一步是这样的:

https://www.nexusjs.org/#/tutorial/chapter-1-setup-and-first-query

api/app.ts输入了代码:

const uid = require('uid')

let i = 0;

const sleep = async (ms: number) => {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms)
    })
}

const recurrenceFunction = async (id:string): Promise<void> => {
    i++;
    console.log(id, i);
    await sleep(2000);
    return recurrenceFunction(id)
}

const startQueue = () => {
    const id:string = uid();
    return recurrenceFunction(id)
}

(async () => {
    return startQueue()
})()

唯一的依赖是uid生成唯一键。

当我使用 ts-node 运行它时,我可以看到:

在此处输入图像描述

所以我们可以看到:

  1. 一旦队列开始。
  2. 有一个队列。
  3. 它可以正常工作。

但是当我nexus通过命令运行这段代码时,nexus dev我看到了:

在此处输入图像描述

所以:

  1. 两个队列开始了。
  2. 它们同时运行。
  3. 他们有独立创建的变量i

问题:

  • 有人遇到这个问题吗?
  • 我应该如何更改我的代码以获得像 in 中的单个队列ts-node
  • 或者也许它是错误的nexus

更新:

我检查了版本是否存在此问题> =0.21.1-next.2

0.21.1-next.1应用程序中运行一次。

重现步骤:

nexus dev
npm i nexus@0.21.1-next.1
nexus dev
npm i nexus@0.21.1-next.2

有提交引入了这种行为:

https://github.com/graphql-nexus/nexus/commit/ce1d45359e33af81169b7ebdc7bee6718fe313a8

有类似但没有参考文档的onMainThread变量REFLECTION_ENV_VAR。我无法理解这段代码在做什么?

这可能会在未来记录在这个地方:

https://www.nexusjs.org/#/architecture?id=build-flow

但现在有:

在此处输入图像描述

更新 2

我找到了解决方法:

const xid = uid();
let limit=10;
const onApplicationStart = async (cb: () => any):Promise<any> => {
    console.log("can i start?", xid, limit, app.private.state.running);
    if(app.private.state.running) {
        await cb()
        return;
    }
    limit--;
    if(limit <= 0) return ;
    await sleep(100);
    return onApplicationStart(cb);
}

(async () => {

    return onApplicationStart(async () => {
        return startQueue()
    })

})()

但这只是暂时的破解而不是解决方案。完整示例:

https://github.com/graphql-nexus/nexus/discussions/983

4

1 回答 1

1

Nexus 不支持依赖副作用的 Eager 模块代码。

看:

对于现在的解决方法,请像这样包装您的代码:

// app.ts
if (!process.env.NEXUS_REFLECTION) {
  yourHeavyAsyncCode()
}

参考https://github.com/graphql-nexus/nexus/issues/732#issuecomment-626586244

于 2020-06-07T10:48:11.240 回答