我有一个用 typescript 写的快速服务器 "module": "es2020"
在它的 tsconfig.
我还开发了另一个 es2020
我的 graphql API 的模块,仍然在 typescript 中,这个模块使用 mongoose 和这样的命名导入:
import { Types } from 'mongoose'
当我使用 tsc
编译我的 graphql 模块时,一切正常.但是运行的 express 服务器nodemon --watch './**/*.ts' --exec 'node --experimental-specifier-resolution=node --loader ts-node/esm' src/index.ts
无法处理名为 import 的 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;
解决方案#1import mongoose from 'mongoose'
并替换 Types
通过 mongoose.Types
.但是自从
tsc
可以处理名为导入的 Mongoose ,我希望也可以使 ts-node 能够这样做。解决方案 #2
切换到
commonjs
,我可以在我的 graphql 模块中保留导入/导出语法并将其编译为 cjs 模块。但是我必须在我的快速服务器中使用 cjs 语法,我不想这样做。
最佳答案
TL;博士
您所要做的就是从类型中删除花括号。那应该行得通。像这样:
import Types from 'mongoose'
但名字并不重要。解释
import Types from 'mongoose'
之所以有效,是因为我们正在导入包的默认导出(这就是我们使用的名称无关紧要的原因)。但是,当您执行
import * as Types from 'mongoose
你告诉 JS 你真的想要一切都是原始的。这意味着不是获取默认导出:{
"function1": {},
"function2": {}
}
你得到这个:{
"default": {
"function1": {},
"function2": {}
}
}
所以你也可以做Types.default
但这可能不那么干净。 🙂This StackOverflow post建议我们可以使两者都工作,但也建议这将是一个可能不应该工作的hacky解决方法😓
关于javascript - 未找到命名导出 'Types'。请求的模块 'mongoose' 是一个 CommonJS 模块,它可能不支持所有 module.exports 作为命名导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70605320/