javascript 未找到命名的导出“类型”,请求的模块'mongoose'是一个CommonJS模块,它可能不支持所有的module.exports作为命名导出

eagi6jfj  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(290)

我有一个用typescript编写的express服务器,它的tsconfig中有"module": "es2020"
我还为我的graphql API开发了另一个es2020模块,仍然是在typescript中,这个模块使用mongoose和这样的命名导入:

import { Types } from 'mongoose'

当我用tsc编译我的graphql模块时,一切都很好。但是运行在
nodemon --watch './**/*.ts' --exec 'node --experimental-specifier-resolution=node --loader ts-node/esm' src/index.ts
无法处理名为导入的mongoose。

import { Types } from 'mongoose';
         ^^^^^
SyntaxError: Named export 'Types' not found. The requested module 'mongoose' 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 'mongoose';
const { Types } = pkg;

方案一

import mongoose from 'mongoose'

Types替换为mongoose.Types
但是由于tsc可以处理名为import的mongoose,我希望也可以使ts-node能够这样做。

方案二

切换到commonjs,我可以在我的graphql模块中保留导入/导出语法,并将其编译为cjs模块。但是我必须在express服务器中使用cjs语法,我不想这样做。

z31licg0

z31licg01#

TL;DR

您所要做的就是从类型中删除花括号。应该可以就像这样:

import Types from 'mongoose'

但名字并不重要。

说明

import Types from 'mongoose'可以工作,因为我们导入的是包的默认导出(这就是为什么我们使用的名称无关紧要)。
然而,当你执行import * as Types from 'mongoose时,你告诉JS你“认真地”想要原始的一切。这意味着不是获取默认导出:

{
    "function1": {},
    "function2": {}
}

你得到这个:

{
    "default": {
        "function1": {},
        "function2": {}
    }
}

所以你也可以做Types.default,但这可能不是那么干净。🙂
This StackOverflow post建议我们可以让两者都工作,但也建议这将是一个可能不应该工作的黑客解决方案😓

ojsjcaue

ojsjcaue2#

如果你在使用mono-repo时遇到这个错误,请确保你遇到问题的模块有

"type": "module"

package.json中。
似乎Nodejs默认会将包视为commonjs,您需要显式地告诉它您的包是一个模块。

相关问题