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

标签 javascript typescript mongoose commonjs ecmascript-2020

我有一个用 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;
解决方案#1
import 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/

相关文章:

javascript - 如何在 react-wavesurfer 中获取当前播放时间?

javascript - 禁用 AJAX 请求直到完成?

Required 的 Angular 验证不起作用

node.js - 在 keystone 中获取相关项目

javascript - Mongoose find()不返回结果

javascript - JS - 禁用选择元素

javascript - 如何通过在javascript中调用函数来重复一个过程

javascript - Mongoose 使用 Promise 或 Async/Await 的区别?

typescript - 使用值实例化 typescript 类实例(对象初始化)

typescript - 如何将方法的泛型类型限制为 typescript 中的对象?