En mi aplicación Node, estoy ejecutando un script para generar una base de datos que usa el generador de consultas KnexJs y PostgreSQL
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é.
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.