如何使用 ChatGPT 解决编码问题
我需要解决的问题
获取答案
副作用
清洁解决方案
加大力度
最后的话
跟进
我需要解决的问题
简单来说,我需要在运行时检查某个 Node 包是否已安装。原因是我正在构建一个新的工具包ZenStack,它为 Prisma 添加了强大的访问控制层和 API 生成功能。由于它构建在Prisma之上,因此在运行 ZenStack 提供的 CLI 时,必须检查 Prisma 是否已安装。否则,它会提示用户先安装 Prisma。
获取答案
让我们尝试直接询问 ChatGPT:
太棒了!答案看起来很有说服力。问题解决了!
副作用
它确实有效,但也带来了一个副作用。在我的 CLI 项目中,我使用async-exit-hook来处理未捕获的错误,如下所示:
// You can hook uncaught errors with uncaughtExceptionHandler(), consequently adding
// async support to uncaught errors (normally uncaught errors result in a synchronous exit).
exitHook.uncaughtExceptionHandler(err => {
console.error(err);
});
成功执行后require(’prisma’)
,这意味着 Prisma 已经存在。如果之后在其他代码中抛出任何未捕获的异常,则uncaughtExceptionHandler
永远不会触发。但是,如果需要任何其他现有模块,例如require(’uuid’)
,则uncaughtExceptionHandler
仍然会像以前一样触发。
虽然我还没找到真正的原因,但从上面来看,导入 Prisma 时似乎有一些代码正在运行。我不确定 Prisma 是否提供了任何标志来控制它;即使提供了,对我来说,这仍然不是一个干净的解决方案,因为它就像潘多拉魔盒一样。你不知道具体执行了什么。
清洁解决方案
避免副作用最直接的方法是使用单独的进程。那么,如果这项工作分配给你,你会怎么做呢?我会使用 npm 命令。所以,让我们再问一遍无所不知的问题:
对我来说这看起来像是一个干净的解决方案。
加大力度
作为优秀的开发者,我们应该始终保持更深入的思考。如果 npm 命令未安装或损坏,该怎么办?如果我们知道 npm 如何找到模块,我们就可以自己处理。
我们再问一遍:
由于 npm 命令显然不会为包执行任何代码,因此它会找到名称和版本作为指定的答案:
它将显示所有已安装软件包的名称和版本
那么,它从哪里获取版本信息呢?当然是从 package.json 文件中获取。实际上,你可以通过dummy-package
在 下创建文件夹node_modules
,然后创建package.json
包含以下内容的文件来轻松验证:
{
"name": "dummy-package",
"version": "9.9.9"
}
然后运行后npm list --depth=0 dummy-package
,你就可以看到包的信息:
helloworld@1.0.0 /Users/jiasheng/branch/helloworld
└── dummy-package@9.9.9 extraneous
因此,我们不必像原始解决方案那样需要模块,而是可以将其更改为需要 package.json 文件,如下所示:
const prisma:any = require('prisma/package.json')
它不仅可以消除副作用,而且您还可以获得该包的更多信息,例如版本等。
最后的话
无论如何,你可以看到 ChatGPT 确实能帮我们很多忙,甚至帮我们写代码,但真正认真思考并彻底解决这个问题的还是我们自己。说到人工智能会取代开发者,我觉得谷歌应该担心这个问题,而不是我们。😉
跟进
Anthony留下了一条评论,提到了使用 ChatGPT 的一个“副作用”。他说道:“虽然 ChatGPT 确实帮你解决了问题,但你仍然无法真正了解发生了什么。”我非常赞同他的观点。因此,我稍微研究了一下 Prisma 的源代码,结果发现 ChatGPT 给出的第一个解决方案的副作用是,当需要 Prisma 时,它会unhandledRejection
在以下代码行中注册事件处理程序:
https://github.com/prisma/prisma/blob/main/packages/cli/src/bin.ts#L57
process.on('unhandledRejection', (e) => {
debug(e)
})
稍后抛出的异常发生在 Promise 处理程序中,因此被此事件处理程序拦截了。因此,另一种修复方法是使用以下方式注册unhandledRejection
事件处理程序:exitHook
// You can hook unhandled rejections with unhandledRejectionHandler()
exitHook.unhandledRejectionHandler(err => {
console.error(err);
});
但我仍然会坚持使用必需的 package.json 解决方案,因为它根本没有副作用。😁
ZenStack是我们开源的 TypeScript 工具包,用于更快、更智能、更高效地构建高质量、可扩展的应用。它将数据模型、访问策略和验证规则集中在 Prisma 之上的单一声明式架构中,非常适合 AI 增强型开发。立即开始将ZenStack与您现有的技术栈集成!
文章来源:https://dev.to/zenstack/how-to-solve-coding-issues-using-chatgpt-15dd