Voici mes fichiers. knexfile.js
require('dotenv').config();
module.exports = {
development: {
client: process.env.DB_CLIENT,
connection: {
Host: process.env.DB_Host,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
},
migrations: {
directory: __dirname + '/db/migrations'
},
seeds: {
directory: __dirname + '/db/seeds'
}
}
};
knex.js
const environment = process.env.NODE_ENV || 'development';
let config = require('../knexfile')[environment];
module.exports = require('knex')(config);
index.js
require('babel-register');
import express from 'express';
const port = process.env.PORT || 5000;
const app = express();
app.listen(port, () => {
console.log('Server running on portt:', port); // eslint-disable-line
});
export default app;
Maintenant, lorsque j'exécute la commande suivante: knex migrate:make create_employee_and_company_tables
Il donne l'erreur suivante
Error: knex: Required configuration option 'client' is missing.
at new Client (/Users/sujin.v2px/NodeJS/nodees6/node_modules/knex/lib/client.js:99:11)
at Knex (/Users/sujin.v2px/NodeJS/nodees6/node_modules/knex/lib/index.js:56:34)
at initKnex (/usr/local/lib/node_modules/knex/bin/cli.js:73:10)
at Command.<anonymous> (/usr/local/lib/node_modules/knex/bin/cli.js:139:22)
at Command.listener (/usr/local/lib/node_modules/knex/node_modules/commander/index.js:315:8)
at emitTwo (events.js:126:13)
at Command.emit (events.js:214:7)
...
Suis-je absent de certaines configurations? À quoi fait référence le client
manquant?
C'est une réponse qui peut être utile pour certaines personnes qui arrivent ici, en raison du même problème où elles utilisent TypeScript. (au-delà du point de problème dotEnv (vérifiez l'autre réponse pour cela)).
Le problème est que votre TypeScript export default
n'est pas pris en charge par knex cli par défaut.
Pour illustrer:
Cela ne fonctionne pas en jetant l'erreur ci-dessus:
Comme vous pouvez le voir, vous pouvez utiliser TypeScript normalement, même la syntaxe d'importation et tout. Ensuite, lorsque vous exportez, vous devez utiliser directement la syntaxe commonjs.
Si cela n'est pas apprécié, vous pouvez vérifier la résolution de ce problème avec github:
https://github.com/tgriesser/knex/issues/1232
Je ne sais pas comment knex se résout pour tsconfig.json. Cela peut être important. Et vous pouvez ajouter un nouveau tsconfig.json où se trouve knexfile.ts.
Dans mon cas, je l'avais dans ma config (c'était dans la racine de mon projet et pas où knexfile.ts [pour la compilation du projet])
"compilerOptions": {
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "ES2018", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'AMD', 'system', 'umd', 'es2015', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
"allowJs": true,
vous voudrez peut-être changer la cible.
Un autre point important, vous devez avoir node-ts
installé, car il est utilisé sous le capot. Cependant, si vous ne le faites pas, vous pouvez avoir une autre erreur complète. Et n'oubliez pas d'installer vos clients ǹpm i --save pg sqlite3 node-ts TypeScript knex
. (vous voudrez peut-être séparer les dépendances de développement).
Je mettrai à jour après plus d'enquête. Pour expliquer en profondeur le pourquoi!
J'ai ce problème et ma configuration est codée en dur:
client: 'pg',
Pour utiliser les variables d'environnement de votre .env
fichier, passez un argument de chemin d'accès à config
comme ceci:
require('dotenv').config({path: 'path-to-.env')
Votre process.env.DB_CLIENT
est undefined
. Vous pouvez le vérifier en codant en dur
client: 'pg',
sans essayer d'utiliser les variables d'environnement/dotenv.
Dans le cas où toutes les lectures de configuration ont échoué et la configuration aurait été indéfinie, une erreur différente aurait été levée (impossible de lire client
de undefined
).
J'ai observé que knexfile.js ne prend pas en charge la configuration env sans chemin.
Utilisez donc comme ci-dessous:
require('dotenv').config({path: './'});
Ce qui a résolu ce problème pour moi était dans mon Knexfile, j'utilisais un nom d'environnement non standard:
let dbConnection = {
client : "pg",
connection: connectionObject,
migrations: {
directory: './db/migrations'
},
useNullAsDefault: true
};
module.exports = {
connection: dbConnection
};
J'ai donc dû exécuter knex migrate:make --env connection migration_name
et cela a fonctionné comme prévu.