Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

261
Vistas
Cómo arreglar en KnexJs el error destroy of undefined

En mi aplicación Node, estoy ejecutando un script para generar una base de datos que usa el generador de consultas KnexJs y PostgreSQL

  • "nodo": "~14.17.6"
  • "knex": "^0.95.15"
  • "pg": "^8.7.1"

El error que estoy recibiendo

 Cannot read property 'destroy' of undefined TypeError: Cannot read property 'destroy' of undefined at process.value (/app/node_modules/knex/lib/knex-builder/make-knex.js:91:26) at process.emit (events.js:315:20) at process.exit (internal/process/per_thread.js:169:15) at success (/app/node_modules/knex/bin/utils/cli-config-utils.js:76:11) at Command.<anonymous> (/app/node_modules/knex/bin/cli.js:236:9) at processTicksAndRejections (internal/process/task_queues.js:93:5)

El script que estoy ejecutando es el siguiente

 const conn = { host: process.env.POSTGRES_HOST, database: process.env.POSTGRES_USER, user: process.env.POSTGRES_USER, password: process.env.POSTGRES_PASSWORD, port: process.env.POSTGRES_PORT, charset: 'utf8', }; const databaseName = process.env.POSTGRES_DB; const knex = require('knex')({ client: 'pg', connection: conn }); knex .raw('CREATE DATABASE ??', databaseName) .then(() => console.info('Successfully created db: ' + databaseName)) .catch((err) => console.warn('Warning: Unable to create db. Probably already exists.', err) ) .finally(() => knex.destroy()) .then(() => { const connection2 = knex({ client: 'pg', connection: { ...conn, database: databaseName }, }); return connection2 .raw('CREATE EXTENSION IF NOT EXISTS citext') .then(() => console.info('Successfully created extension citext')) .catch((err) => console.error('Unable to create extension citext.', err)) .finally(() => connection2.destroy()); }) .then(() => process.exit(0));

No puedo entender qué causa el problema y por qué.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Creo que el problema probablemente se deba a un malentendido sobre cuál es la instancia de knex y cuál es la instancia de conexión.

En esta parte:

 const knex = require('knex')({ client: 'pg', connection: conn });

Ha definido una conexión utilizando el módulo knex. Entonces, cuando invoque "knex" para crear una segunda conexión a continuación:

 .then(() => { const connection2 = knex({ client: 'pg', connection: { ...conn, database: databaseName }, });

connection2 no es una conexión porque knex en este contexto es la conexión deseada . Podría usar el objeto de conexión knex anterior.

Para evitar estos problemas, te recomiendo separar las cosas y cambiar el nombre de las variables para que sea más explicable:

 const knex = require('knex') // this is the knex module const connection = knex({ client: 'pg', connection: conn }) // This is a connection using knex // So you should use `connection` instead `knex`, as you are using the connection instance to perform queries connection .raw('CREATE DATABASE ??', databaseName) // ... .then(() => { // Now this should work and return a connection const connection2 = knex({ client: 'pg', connection: { ...conn, database: databaseName }, }); // But as connection2 is actually the same of connection, it could be // const connection2 = connection; return connection2 // or return connection .raw('CREATE EXTENSION IF NOT EXISTS citext') .then(() => console.info('Successfully created extension citext')) .catch((err) => console.error('Unable to create extension citext.', err)) .finally(() => connection2.destroy()); })

Otro punto del que hablar es que si es realmente necesario finalizar la conexión y crear otra justo después de la primera llamada a destroy() . Como puede tener una instancia para la connection , puede usarla mientras realiza consultas y simplemente destruirla una vez si ya no es necesaria.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda