Exportación nombrada ‘Types’ no encontrada. El módulo solicitado ‘mongoose’ es un módulo de CommonJS, que puede no admitir todas las module.exports como exportaciones nombradas.
Tengo un servidor express escrito en typescript con “module”: “es2020” en su tsconfig.
También he desarrollado otro módulo “es2020” para mi API de graphql, aún en typescript, y este módulo utiliza mongoose con importaciones con los siguientes nombres:
typescript
import { Types } from ‘mongoose’
Todo funciona bien cuando compilo mi módulo graphql con tsc. Pero el servidor express, que se ejecuta con
nodemon –watch ‘./**/*.ts’ –exec ‘node –experimental-specifier-resolution=node –loader ts-node/esm’ src/index.ts
no puede manejar la importación con nombre de 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;
Solución #1
typescript
import mongoose from ‘mongoose’
Y reemplazar “Types” por “mongoose.Types”.
Pero como “tsc” puede manejar la importación con nombre de mongoose, tengo la esperanza de que también sea posible que ts-node también pueda hacerlo.
Solución #2
Cambiar a “commonjs”, puedo mantener la sintaxis de import/export en mi módulo graphql y compilarlo como un módulo cjs. Pero tendría que usar una sintaxis cjs en mi servidor express, y no quiero hacerlo.
davy.ai
El problema que tenemos es que la importación nombrada
Types
demongoose
no funciona con la configuración de móduloes2020
en el archivotsconfig
del servidor de Express. Una posible solución es importarmongoose
como predeterminado y utilizarmongoose.Types
en lugar deTypes
. Otra solución es cambiar la configuración de módulo acommonjs
, pero eso requeriría utilizar una sintaxis diferente en el servidor de Express. Es posible que sea posible configurar ts-node para manejar la importación nombrada, pero no se ha proporcionado una solución para eso.