auth0 / node-jsonwebtoken

JsonWebToken implementation for node.js http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
MIT License
17.73k stars 1.23k forks source link

import `jsonwebtoken` throws error #963

Open jim-king-2000 opened 8 months ago

jim-king-2000 commented 8 months ago

Description

import jsonwebtoken throws error

Reproduction

The code:

import { verify } from "jsonwebtoken";

The error message:

import { verify } from "jsonwebtoken";
         ^^^^^^
SyntaxError: Named export 'verify' not found. The requested module 'jsonwebtoken' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'jsonwebtoken';
const { verify } = pkg;

    at ModuleJob._instantiate (node:internal/modules/esm/module_job:134:21)
    at async ModuleJob.run (node:internal/modules/esm/module_job:217:5)
    at async ModuleLoader.import (node:internal/modules/esm/loader:323:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:120:12)

Node.js v21.7.0

It works on v9.0.0 but fails on 9.0.2.

Environment

Please provide the following:

amandesai01 commented 7 months ago

Facing same issue! what happened?

For me, not working with even 9.0.0. I can access other functions such as decode

fuadsaud commented 6 months ago

I started experiencing this problem after I switched to using ESM modules on my code. The solution, as the error message suggests, was to stop using named exports and rely on the default import syntax.

IYATT-yx commented 6 months ago

It can be written like this

import jwt from 'jsonwebtoken'; const { sign, verify } = jwt;

amandesai01 commented 6 months ago

I just commented @ts-ignore before calling verify method and it all started working. Weird. Can anyone tell me what might be the issue? Using Nitro server.

vircoding commented 2 months ago

Same problem when importing the error classes on v.9.0.2, and TypeScript doesn't throw any error in editor, but Nitro (Nuxt v3.13.0) does. So far, I only find a solution by not destructuring the module and importing everything.

import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken' // ❌

import jwt from 'jsonwebtoken' // 👍
jwt.JsonWebTokenError // 👍

Idk if it's a jsonwebtoken or nitro/nuxt related bug...

pappnase99 commented 2 months ago

Just ran into this issue as well using Typescript. I want to deploy some ESM code that is using the sign function like this: import { sign } from 'jsonwebtoken'; On compilation this is fine because the '@types/jsonwebtoken' lib is suggesting that the 'sign' function is exported. However when the code is executed I get this error: SyntaxError: The requested module 'jsonwebtoken' does not provide an export named 'sign'. This is running on Node.js 20.

I guess the issue is that this package is CommonJS only, so when importing this into ESM, named exports are not working and you have to fall back on using default import. Still not sure why Typescript thinks it should work though.

DesertCookie commented 2 months ago

I guess the issue is that this package is CommonJS only, so when importing this into ESM, named exports are not working and you have to fall back on using default import. Still not sure why Typescript thinks it should work though.

ChatGPT told me this too after even your solution wouldn't work. It suggested using import * as jwt from 'jsonwebtoken' and jwt.sign(...) instead of just sign(...) which does seem to eliminate all errors in my case.