es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

esbuild + knex: No se puede encontrar el módulo ‘../../dialects/mysql/index.js’

Actualmente estoy tratando de migrar un código de JavaScript a TypeScript. Este código utiliza el paquete “knex”. Soy capaz de construirlo y ejecutarlo utilizando “tsc”, pero me gustaría utilizar “esbuild” en su lugar (para una construcción más rápida).

Construyo con:

npx esbuild index.ts --bundle --platform=node --sourcemap=external --outfile=dist/index.js

Pero cuando intento ejecutar el código compilado, obtengo:

No se puede encontrar el módulo '../../dialects/mysql/index.js'

No tengo idea de qué es este directorio “dialect” y no pude encontrar ninguna documentación al respecto. Eché un vistazo a esta pregunta en Stack Overflow (https://stackoverflow.com/questions/37323425/mysql-dialect-cannot-be-fount-in-knex-browserified), pero no pude entender realmente el código que había en ella, y el error parecía estar más relacionado con “browserified”.

Aquí está el código que utilicé para reproducir el error:

import Knex from 'knex';

const knex = Knex({
  client: 'mysql',
  connection: {
    port: 3306,
    host: 'localhost',
    database: 'database',
    user: 'user',
    password: 'password',
    charset: 'utf8mb4',
  },
});

const fetchData = async () => {
  const data = await knex('table')
    .select()
    .first();
  return data;
};

(async () => {
  const results = await fetchData();
  console.log(results);
})();

Lo interesante es que el uso únicamente del paquete “mysql” sin “knex” funcionó bien tanto con “tsc” como con “esbuild”.

Por alguna razón, solo la construcción con “esbuild” falla. Primero pensé que me faltaba algún paquete, e instalé “@types/node” y “@types/mysql” pero no solucionó mi problema.

Si ayuda, utilizo el siguiente “tsconfig.json”:

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist",
    "target": "es6",
    "esModuleInterop": true
  }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí parece estar en la ruta relativa del módulo ../../dialects/mysql/index.js que knex está intentando importar. Mientras que tsc podría ser lo suficientemente inteligente como para resolver la ruta correcta, es posible que esbuild no pueda hacerlo.

    Una solución alternativa para este problema es especificar manualmente la ruta al módulo mysql en la configuración de knex, en lugar de depender de la ruta relativa. Así es como se hace:

    import Knex from 'knex';
    import mysql from 'mysql2/promise'; // importa mysql desde el paquete npm requerido
    
    const knex = Knex({
      client: 'mysql',
      connection: {
        // Utiliza el paquete mysql importado en lugar de depender de la ruta relativa
        client: 'mysql2',
        connection: mysql.createConnection({
          port: 3306,
          host: 'localhost',
          database: 'database',
          user: 'user',
          password: 'password',
          charset: 'utf8mb4',
        }),
      },
    });
    
    // el resto del código sigue siendo el mismo
    

    Al utilizar el paquete mysql2/promise y pasar el objeto de conexión directamente a la configuración de knex, evitamos el posible problema de resolución de rutas con las importaciones de knex. Esto debería funcionar tanto con tsc como con esbuild.

    Algo a tener en cuenta es que knex depende del paquete mysql2 internamente, por lo tanto, debemos asegurarnos de usar el nombre adecuado del cliente en la configuración de knex.

Comments are closed.