gpt4 book ai didi

javascript - 无服务器堆栈 : Maximum call stack size exceeded only in windows during npm run start

转载 作者:行者123 更新时间:2023-12-04 14:04:26 25 4
gpt4 key购买 nike

我开始使用无服务器堆栈指南,但很快就在 Windows 10 中遇到了瓶颈(相同的步骤不会在 Mac 或 Linux 中造成任何问题)。

我创建了一个简单的无服务器堆栈项目,并执行以下操作:npm 运行开始

我明白了:

RangeError: Maximum call stack size exceededat Object.resolve (path.js:153:10)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:38)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)at getManager (D:\Sources\demo-notes-app\node_modules@serverless-stack\core\dist\packager\packager.js:48:12)

Node版本是v14.17.5,npm是7.21.1

由于我几乎没有实例化该项目并且它正在其他平台上运行,所以我真的不知道如何解决这个问题。

谢谢

最佳答案

嗯,您通常会从检查调用堆栈中的代码/文件开始,看看是否能为您提供任何线索。从我们可以看到的一点点看来,getManager() 一遍又一遍地调用自己。只是猜测,但这可能是配置错误或触发它执行此操作的其他错误路径。

如果你去看看 serverless-stack/core/dist/packager/packager.js github ,你看到这个函数:

export function getManager(dir: string): Manager {
const lock = path.join(dir, "yarn.lock");
if (fs.existsSync(lock)) return Yarn;
if (dir === "/") return NPM;
return getManager(path.resolve(dir, ".."));
}

所以,看起来这是试图做的是寻找一个 yarn.lock 文件。如果找到一个,返回 Yarn。如果我们已经在 / 的顶级路径,那么 return NPM。否则,递归调用自身,但在目录层次结构中上升一个级别并重新开始。所以,如果代码实际上是这样工作的,它应该以 dir === "/" 在 *nix 的顶层结束,除了在 Windows 上可能不是这种情况,因为两种可能原因:

  1. Windows 可能在路径的开头有一个驱动器号。
  2. Windows 使用“\”作为路径分隔符,而不是“/”。

缩小范围的一种方法是暂时将一些日志记录在此 getManager() 函数中以查看它正在传递的内容(只需暂时编辑 dist 目录中的版本 - 确保您正在编辑编译/转译版本,而不是 TypeScript 版本,除非你要重新构建它)。

export function getManager(dir: string): Manager {
console.log("getManager()", dir); // <== add this
const lock = path.join(dir, "yarn.lock");
if (fs.existsSync(lock)) return Yarn;
if (dir === "/") return NPM;
return getManager(path.resolve(dir, ".."));
}

查看此处传递的内容将表明上述两个问题中的哪一个可能导致问题。从代码来看,只要确保您只向它传递一 strip 正斜杠的路径,它就可以正常工作,但是必须测试一下,看看这里涉及的其他代码是否可以接受。

仅供引用,通过将代码更改为以下代码,可以使此代码对 Windows 世界更加宽容:

// regex that matches / or \ or d:/ or d:\
const topPath = /^(\/|\\|[a-z]:[\/\\]|)$/i;

export function getManager(dir: string): Manager {
console.log("getManager()", dir);
const lock = path.join(dir, "yarn.lock");
if (fs.existsSync(lock)) return Yarn;
if (topPath.test(dir)) return NPM;
return getManager(path.resolve(dir, ".."));
}

请注意,这还没有被编码来处理 Windows 上以“\\”开头的 UNC 路径,但它当然也可以适应这种情况。


再仔细考虑一下,这里有一个更简单的方法来避免到达顶部时的无限循环。如果尝试上升 .. 不会改变路径,那么您就在顶部:

export function getManager(dir: string): Manager {
const lock = path.join(dir, "yarn.lock");
if (fs.existsSync(lock)) return Yarn;
let upDir = path.resolve(dir, "..");
// if we didn't actually go up any more, then we're at the top
if (upDir === dir) {
return NPM;
}
return getManager(upDir);
}

关于javascript - 无服务器堆栈 : Maximum call stack size exceeded only in windows during npm run start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68977765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com