Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

259
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!