如何使用 ChatGPT 解决编码问题我需要解决的问题获得答案副作用干净的解决方案更加努力最后的话跟进

2025-06-07

如何使用 ChatGPT 解决编码问题

我需要解决的问题

获取答案

副作用

清洁解决方案

加大力度

最后的话

跟进

我需要解决的问题

简单来说,我需要在运行时检查某个 Node 包是否已安装。原因是我正在构建一个新的工具包ZenStack,它为 Prisma 添加了强大的访问控制层和 API 生成功能。由于它构建在Prisma之上,因此在运行 ZenStack 提供的 CLI 时,必须检查 Prisma 是否已安装。否则,它会提示用户先安装 Prisma。

获取答案

让我们尝试直接询问 ChatGPT:

GPT-1

太棒了!答案看起来很有说服力。问题解决了!

副作用

它确实有效,但也带来了一个副作用。在我的 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);
});
Enter fullscreen mode Exit fullscreen mode

成功执行后require(’prisma’),这意味着 Prisma 已经存在。如果之后在其他代码中抛出任何未捕获的异常,则uncaughtExceptionHandler永远不会触发。但是,如果需要任何其他现有模块,例如require(’uuid’),则uncaughtExceptionHandler仍然会像以前一样触发。

虽然我还没找到真正的原因,但从上面来看,导入 Prisma 时似乎有一些代码正在运行。我不确定 Prisma 是否提供了任何标志来控制它;即使提供了,对我来说,这仍然不是一个干净的解决方案,因为它就像潘多拉魔盒一样。你不知道具体执行了什么。

清洁解决方案

避免副作用最直接的方法是使用单独的进程。那么,如果这项工作分配给你,你会怎么做呢?我会使用 npm 命令。所以,让我们再问一遍无所不知的问题:

GPT-2

对我来说这看起来像是一个干净的解决方案。

加大力度

作为优秀的开发者,我们应该始终保持更深入的思考。如果 npm 命令未安装或损坏,该怎么办?如果我们知道 npm 如何找到模块,我们就可以自己处理。

我们再问一遍:

GPT-3

由于 npm 命令显然不会为包执行任何代码,因此它会找到名称和版本作为指定的答案:

它将显示所有已安装软件包的名称和版本

那么,它从哪里获取版本信息呢?当然是从 package.json 文件中获取。实际上,你可以通过dummy-package在 下创建文件夹node_modules,然后创建package.json包含以下内容的文件来轻松验证:

{
    "name": "dummy-package",
    "version": "9.9.9"
}
Enter fullscreen mode Exit fullscreen mode

然后运行后npm list --depth=0 dummy-package,你就可以看到包的信息:

helloworld@1.0.0 /Users/jiasheng/branch/helloworld
└── dummy-package@9.9.9 extraneous
Enter fullscreen mode Exit fullscreen mode

因此,我们不必像原始解决方案那样需要模块,而是可以将其更改为需要 package.json 文件,如下所示:

const prisma:any = require('prisma/package.json')
Enter fullscreen mode Exit fullscreen mode

它不仅可以消除副作用,而且您还可以获得该包的更多信息,例如版本等。

最后的话

无论如何,你可以看到 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)
})
Enter fullscreen mode Exit fullscreen mode

稍后抛出的异常发生在 Promise 处理程序中,因此被此事件处理程序拦截了。因此,另一种修复方法是使用以下方式注册unhandledRejection事件处理程序:exitHook

// You can hook unhandled rejections with unhandledRejectionHandler()
exitHook.unhandledRejectionHandler(err => {
    console.error(err);
});
Enter fullscreen mode Exit fullscreen mode

但我仍然会坚持使用必需的 package.json 解决方案,因为它根本没有副作用。😁


ZenStack是我们开源的 TypeScript 工具包,用于更快、更智能、更高效地构建高质量、可扩展的应用。它将数据模型、访问策略和验证规则集中在 Prisma 之上的单一声明式架构中,非常适合 AI 增强型开发。立即开始将ZenStack与您现有的技术栈集成!

文章来源:https://dev.to/zenstack/how-to-solve-coding-issues-using-chatgpt-15dd
PREV
微服务去哪儿了 微服务新技术反思
NEXT
如何在 Vercel 上托管 RESTful API