-
Notifications
You must be signed in to change notification settings - Fork 29.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
No stack trace with missing async keyword and dynamic imports #32177
Comments
/cc @nodejs/modules |
See also #49441 |
this is a very general issue with how our error stack decoration works, and not specific to the esm loader. We can fix this in two different ways:
|
Ah, I see @devsnek. Thanks for the explanation! I decided to report this issue because with a larger codebase it's actually a pretty significant time waster. For my PhD I have a dynamic import system for a number of subcommands that do different things in a Node.js application. It's becoming a serious challenge to figure out where I've made a mistake..... I can grant private access to this codebase if this would help fixing the bug. |
@sbrl Just want to note that adding a linter may help in this case by allowing you to locate errors and get that more useful stack trace without needing to actually execute the code. |
@ExProbitasFiducia Right. I'm actually already using a linter, but it doesn't detect issues with |
Shouldn't really matter which editor you have, the linter should perform the same even if you execute it from the cli. I'm a fan of eslint and they do have a rule for async/await - https://eslint.org/docs/rules/require-await Im not sure if this is useful, or related for you but I thought it was some neat info; there is a class of bugs associated with writing an async function that never uses the await keyword. I had an issue once where the await was in a conditional and I remember that was a pretty tricky thing to track down. |
|
That's the way I understand async is supposed to work. As I mentioned I've found that there are circumstances in which an async function doesn't await a value causes problem. I hope you don't run into it but that rule prevents it from happening anyway... |
Again, the issue there is that you're not awaiting a promise, which is unrelated to the presence or absence of |
- it gives this weird error: SyntaxError: Unexpected reserved word at Loader.moduleStrategy (internal/modules/esm/translators.js:140:18) at async link (internal/modules/esm/module_job.js:42:21) - found these issues; should debug further: - nodejs/node#32177 - https://github.com/nodejs/modules/issues/471
- it gives this weird error: SyntaxError: Unexpected reserved word at Loader.moduleStrategy (internal/modules/esm/translators.js:140:18) at async link (internal/modules/esm/module_job.js:42:21) - found these issues; should debug further: - nodejs/node#32177 - https://github.com/nodejs/modules/issues/471
- it gives this weird error: SyntaxError: Unexpected reserved word at Loader.moduleStrategy (internal/modules/esm/translators.js:140:18) at async link (internal/modules/esm/module_job.js:42:21) - found these issues; should debug further: - nodejs/node#32177 - https://github.com/nodejs/modules/issues/471
What steps will reproduce the bug?
Consider the following code:
a.mjs
b.mjs
Explanation
There is obviously a bug in
b.mjs
above. Thebug()
function is missing theasync
keyword`. However, when I attempt to execute the above, I get the following error:This isn't particularly helpful. Now, consider the following snippet:
c.mjs:
There's bug in this one too, but executing it yields a very different and much more helpful error:
Much better. Node gives us a helping hand by telling us where the error occurred.
How often does it reproduce? Is there a required condition?
This bug in the error message only appears to occur when a module is dynamically imported with
import("./path/to/file.mjs")
. Specifically, the first error message is missing this bit:...obviously the filepath and line number would be different for b.mjs is this bit was added.
What is the expected behavior?
The first error message should look like the second.
When dynamically importing a module that is missing the async keyword on a method, the error message should tell me where the error occurred.
What do you see instead?
The bit there it tells me where the "unexpected reserved word" was found is missing. See above for examples of what's gone wrong.
Additional information
If possible, when it's the
await
keyword that was detected as unexpected, the error message should reflect this more closely. For example, it might be helpful to say `SyntaxError: Unexpected reserved word "await" (did you forget the "async" keyword?)" or something like that.The text was updated successfully, but these errors were encountered: