我有一个用TypeScript编写的Express服务器,它的tsconfig中使用了"module": "es2020"
。
我还开发了另一个用TypeScript编写的es2020
模块,用于我的GraphQL API,并且这个模块使用mongoose,其命名导入如下:
import { Types } from 'mongoose'
当我使用tsc
编译我的GraphQL模块时,一切都很正常。但是,使用以下命令运行的Express服务器无法处理mongoose的命名导入:
nodemon --watch './**/*.ts' --exec 'node --experimental-specifier-resolution=node --loader ts-node/esm' src/index.ts
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;
解决方案 #1
import mongoose from 'mongoose'
将 Types
替换为 mongoose.Types
。
但由于 tsc
可以处理 mongoose 的命名导入,我希望 ts-node 也可以这样做。
解决方案 #2
切换到 commonjs
,我可以在我的 graphql 模块中保留 import/export 语法并将其编译为 cjs 模块。但我必须在我的 express 服务器中使用 cjs 语法,而我不想这样做。
@types/mongodb
添加到我的模块中并不能让我在使用 ts-node 时使用 mongoose 命名导入,顺便说一下,我不仅从 mongoose 中导入Types
,在其他一些文件中我还导入了Schema
和Model
。而且我面临着同样的错误。 - 0xChqrlestsc
构建我的express服务器,这个方法很好用,但是每次修改后都需要重新构建和启动服务器。 - 0xChqrles