The Issue I need to solve
Simply put, I need to check if a node package is installed in runtime. The reason is that I’m building a new toolkit ZenStack, that supercharges Prisma with a powerful access control layer and API generation. Since it is built above Prisma, when running the CLI provided by ZenStack, it must check whether Prisma has already been installed. Otherwise, it would prompt the user to install Prisma first.
Get the answer
Let’s try to ask ChatGPT directly:
Cool! The answer looks compelling. Problem solved!
The side effect
It does work, but it brings one side effect. In my CLI project, I use async-exit-hook to handle uncaught errors like the below:
// 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);
});
After the require(’prisma’)
is executed successfully, which means the Prisma is there, if later in other code you throw any uncaught exception, the uncaughtExceptionHandler
would never be triggered. But if require any other existing module like require(’uuid’)
, then the uncaughtExceptionHandler
would still be triggered as before.
Although I haven’t found the real cause, from the above It looks like some code is running when Prisma is imported. I’m not sure whether Prisma provides any flag to control it; even if it does, it still doesn’t sound like a clean solution to me because it is like Pandora's box. You won’t know what gets executed.
Clean solution
The most direct way to avoid a side effect is to use a separate process. So how would you do that if the job is assigned to you? I will use the npm command. So let’s ask the omniscient again:
This looks like a clean solution to me.
Push harder
As good developers, we should always try to think further. What if the npm command is not installed or is broken? If we know how npm finds the module, we could do that ourselves.
Let’s ask again:
As the npm command obviously won’t execute any code for the package, it does find the name and version as the answer specified:
It will display the names and versions of all the installed package
So, where does it get the version information? Of course, from package.json file. Actually, you can easily verify it by creating dummy-package
folder under node_modules
, and then creating the package.json
file with the below content:
{
"name": "dummy-package",
"version": "9.9.9"
}
Then after running npm list --depth=0 dummy-package
, you could see the package info:
helloworld@1.0.0 /Users/jiasheng/branch/helloworld
└── dummy-package@9.9.9 extraneous
Therefore, instead of requiring the module like the original solution, we could change it to require the package.json file like:
const prisma:any = require('prisma/package.json')
Not only does it get rid of the side effect, but also you could get more information for that package, like version, etc.
Final Words
Anyway, you can see ChatGPT really could help us a lot, even writing the code for us, but it is us who actually think and resolve the issue thoroughly. Coming to the thought that AI would replace developers, I think Google should worry about that rather than us. 😉
Follow up
There is one comment left by Anthony that brings up one “side effect” of using ChatGPT “while ChatGPT arguably helped you solve your problem, you still failed to actually learn what was going on”, which I can’t agree more. Therefore, I investigated a little bit about the source code of Prisma, it turns out that the side effect of the first solution ChatGPT given is that when Prisma is required, it registered unhandledRejection
event handler in the below line:
https://github.com/prisma/prisma/blob/main/packages/cli/src/bin.ts#L57
process.on('unhandledRejection', (e) => {
debug(e)
})
The exception thrown later is in the Promise handler, so it got intercepted by this event handler. Therefore, another way of fixing it is to also register unhandledRejection
event handler using exitHook
like below:
// You can hook unhandled rejections with unhandledRejectionHandler()
exitHook.unhandledRejectionHandler(err => {
console.error(err);
});
But I would still stick to the required package.json solution as it has no side effects at all. 😁
ZenStack is our open-source TypeScript toolkit for building high-quality, scalable apps faster, smarter, and happier. It centralizes the data model, access policies, and validation rules in a single declarative schema on top of Prisma, well-suited for AI-enhanced development. Start integrating ZenStack with your existing stack now!
Top comments (35)
Practically speaking, All blogs I have read so far about ChatGPT even the ones from the very people we consider sane in our industry semm to be not factual. Yes chatgpt can do a lot of magic but it needs someone who knows what he/she is doing. Don't expect someone who has never done coding before to become a rocket scientist because of chatgpt. One boring thing I have read over the past two weeks also was the comparison of chatgpt to other ai models like palm which as of now no one has ever used in public. As if that is not insane enough some youtubers are posting things that put fear in developers minds. Take heart guys they will need developers even if an ai system becomes sentient it cannot be human. That's my take.
The promoted fear of ChatGPT can be a useful filter to block people who're not psychologically strong enough to enter this profession ...
Interesting idea. Sounds like it could improve the overall quality of developers from one more perspective. 😄
Je suis totalement d’accord avec vous. Quelque soit alpha nous, les développeurs ne disparaîtrons pas. Bien vrai que ChatGPT aide énormément il a toujours besoin qu’on lui donne des directives bien définies pour pouvoir nous étaler nos besoins.
La seule question qui me traîne dans l’esprit 🤔 en ce moment : Pourquoi Google serait-il craintif ?
Sur ceux, je vous souhaite une bonne et heureuse année 2023.
Because I think there would be more and more cases in that people would directly ask questions for ChatGPT instead of searching in google like what I did in this post. 😄
However, I guess Google would probably provide a similar service in the future as Larry Page said “we are really making AI” before google’s IPO. 😉
I heard they have dedicated a team to create something similar 🙂.
And I'm guessing Google tactics would be to make it free forever and start placing Ads later.
😂 That does sounds like Google’s tactics.
Sure, but they will need less developers
Mmm... I suspect coding is like health care: the more the available offer, the larger the demand.
Consider how much manual work is still performed, and how much could be automated. It'll take us three generations to fill those requirements, and another two to redo stuff that was poorly done.
Speaking of YouTubers, I think that’s part of the nature of media, exaggerating to exploding. Here Dev.to is more objectives as it’s really to Dev. 😄
I've done enough tinkering with it that I feel reasonably confident talking about what it can and can't do, and I'm confident it's not going to replace me. At this point it's basically not much more than a smarter search engine - it's better than Google at tracking down specific examples of a particular thing, and you can refine those examples progressively to get it closer to what you want, but you still need to understand those examples to be able to implement them. It does make more of the job about composition and editing than about writing code, but you still need to be able to understand what's going on, though.
I would be far more concerned about my job if it was the poorest sort of content creation though. Given how bad those sort of blog posts tend to be, and the fact that ChatGPT is noticeably better at producing them, I would not be surprised if those sort of poor quality blog posts are overwhelmingly written by AI in a year.
What I find interesting is that while ChatGPT arguably helped you solve your problem, you still failed to actually learn what was going on. The reason your unhandledError hook didn't fire has nothing to do with prisma potentially having a flag or doing something odd. The solution ChatGPT provided involves handling the module not found exception... therefore by definition your unhandled hook is never going to fire. The whole subprocess hack that you're calling a _Clean Solution _ is completely unnecessary and misleading to others who may unfortunately stumble upon this article.
A better approach to become an adequate developer... always aim to understand a situation, then solve it. Searching for the solution seems like the fast path but in the end you're left with buggy, ineffective code that kinda/sorta sometimes works... all because you don't truly understand what's happening.
It's like going to the doctor saying your leg hurts. The doctor gives you morphine and all the sudden, you feel better! Problem solved!!! Except your leg was broken and you needed a cast. You can't just treat the symptom as a doctor, or a developer.
That said, maybe ask ChatGPT about unhabdled vs handled exceptions and understand how, why, and when the unhandled exception filter would get executed. Best of luck
Hi Anthony, it seems that l didn’t specify the problem clearly, thanks for pointing it out. I have updated the corresponding content to make it clear.
As you can see I still believe it’s caused by some code of Prisma running when importing the Prisma module because using any other existing module would be fine.
Anyway, I think you are right that I still haven’t truly understand what’s happening under the hood 😂. I think it requires some investigation of the source code of Prisma. I will take a look later and update the result here.
Updated in the end of the post.
Yes google should worry about that 🤣
Did you try chatgpt x google search engine. It's developed by me. Try it out and let's me know what you think 😄😄
Try it
Nice tool! You are actually threatening Gooogle. 😁
hahaha
It took me 5 days to steer it to making the blender script in needed and during that time it needed a lot of corrections from me, it didn’t know what was correct and modern and wasn’t aware of API changes until I told it. It also looped around a solution quite a few times or flat out misunderstood this visual task… it’s still incredible
I like your attitude, It’s all about how we can utilize it. 😄
ChatGPT has so much potential I can't wait to see what else it will be capable of doing in 2023.
me too! 😎
I tried te debug a lua app concerning merging two lists, all the code the chat gave seemed logical, but variable names, logic, etc.. was all wrong in a way that led to weird bugs.
It can give hints, but often it will reference constants from an entire different language or app
Use it as a rubber duck, not to generate your code.
exacly!
In other words, careful intelligent use turns it into another developer amplifier rather than a developer replacer.
I like it.
Nice one, it’s concise and comprehensive!👍
Exactly. And we need chatGPT to work for us. 😄
YouTubers are clickbait hunters.
I’m aware of this recently, as I see some has to literally put (Not Clickbait) in the title 😂
Yes, it's a tool, not a replacement.