与 knex 的未定义数据库连接
Undefined db connection with knex
我正在执行以下脚本,node acl.js
:
acl.js
require('dotenv').config()
const _ = require('lodash');
const buckets = require('./buckets');
const knex = require('../src/config/db'); //HERE I am getting the ERROR
var downSql = 'DROP TABLE IF EXISTS "{{prefix}}{{meta}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{resources}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{parents}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{users}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{roles}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{permissions}}";';
var upSql = 'CREATE TABLE "{{prefix}}{{meta}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'INSERT INTO "{{prefix}}{{meta}}" VALUES (\'users\', \'{}\');'+
'INSERT INTO "{{prefix}}{{meta}}" VALUES (\'roles\', \'{}\');'+
'CREATE TABLE "{{prefix}}{{resources}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{parents}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{roles}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{users}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{permissions}}" (key TEXT NOT NULL PRIMARY KEY, value JSON NOT NULL);';
function tmpl(str, ctx) {
var n = 1;
var sql = str.replace(/{{(\w+)}}/g, function(match, cap1) {
return ctx[cap1] || match;
});
return sql.replace(/\?/g, function() { return '$' + n++; });
}
function createTables(callback) {
var prefix = ''
var bucketNames = buckets(args[8])
if (!prefix) prefix = 'acl_';
knex.raw(tmpl(downSql+upSql, {
'meta': bucketNames.meta,
'parents': bucketNames.parents,
'permissions': bucketNames.permissions,
'prefix': prefix,
'resources': bucketNames.resources,
'roles': bucketNames.roles,
'users': bucketNames.users
}))
.then(function() {
if (!_.isUndefined(callback)) {
callback(null, db);
}
})
;
}
createTables()
buckets.js
'use strict';
var _ = require('lodash');
var buckets = function(options){
return _.extend({
meta: 'meta',
parents: 'parents',
permissions: 'permissions',
resources: 'resources',
roles: 'roles',
users: 'users'
}, options);
};
exports = module.exports = buckets;
当我 运行 node acl.js
我得到以下错误:
> node acl.js
{ development:
{ client: undefined,
connection: { user: undefined, password: undefined, database: undefined } } }
undefined
C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\node_modules\knex\lib\index.js:49
if (arguments.length === 0 || !config.client && !config.dialect) {
^
TypeError: Cannot read property 'client' of undefined
at Knex (C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\node_modules\knex\lib\index.js:49:40)
at Object.<anonymous> (C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\src\config\db.js:8:29)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Module.require (module.js:517:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\node_acl\acl.js:5:14)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Function.Module.runMain (module.js:609:10)
错误来自我的 acl.js
文件中的 const knex = require('../src/config/db');
行。
我的 db.js
文件如下所示:
require('dotenv').config()
// Loading from an external file
const config = require('../../knexfile')
console.log(config)
const env = process.env.DB_ENV
console.log(env)
const knex = require('knex')(config[env])
knex.on('query', (queryData) => {
console.log(queryData)
})
module.exports = knex
如您所见,console.log
语句在上面显示的输出中主要返回 undefined
。
knexfile.js
正在从 .env file
加载配置
knexfile.js
require("dotenv").config()
module.exports = {
development: {
client: process.env.DB_CONNECTION,
connection: {
user: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
},
},
}
.env
# Database
DB_CONNECTION=postgresql
DB_ENV=development
DB_USERNAME=root
DB_PASSWORD=root
DB_DATABASE=nodeacl
当我运行knex migrate:latest
或knex seed:run
种子和迁移文件运行完美。
对我出现上述错误有何建议?
当您 运行 knex migrate:latest
和 knex seed:run
时,它会起作用,因为您的文件 knexfile.js
与您的文件 .env
位于同一层文件系统。这意味着您的环境变量已正确导入。
你的文件acl.js
在同一级别吗?如果没有,也许你应该 运行 node /path/to/acl.js
从 .env
级别开始。
我正在执行以下脚本,node acl.js
:
acl.js
require('dotenv').config()
const _ = require('lodash');
const buckets = require('./buckets');
const knex = require('../src/config/db'); //HERE I am getting the ERROR
var downSql = 'DROP TABLE IF EXISTS "{{prefix}}{{meta}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{resources}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{parents}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{users}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{roles}}";'+
'DROP TABLE IF EXISTS "{{prefix}}{{permissions}}";';
var upSql = 'CREATE TABLE "{{prefix}}{{meta}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'INSERT INTO "{{prefix}}{{meta}}" VALUES (\'users\', \'{}\');'+
'INSERT INTO "{{prefix}}{{meta}}" VALUES (\'roles\', \'{}\');'+
'CREATE TABLE "{{prefix}}{{resources}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{parents}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{roles}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{users}}" (key TEXT NOT NULL PRIMARY KEY, value TEXT[][] NOT NULL);'+
'CREATE TABLE "{{prefix}}{{permissions}}" (key TEXT NOT NULL PRIMARY KEY, value JSON NOT NULL);';
function tmpl(str, ctx) {
var n = 1;
var sql = str.replace(/{{(\w+)}}/g, function(match, cap1) {
return ctx[cap1] || match;
});
return sql.replace(/\?/g, function() { return '$' + n++; });
}
function createTables(callback) {
var prefix = ''
var bucketNames = buckets(args[8])
if (!prefix) prefix = 'acl_';
knex.raw(tmpl(downSql+upSql, {
'meta': bucketNames.meta,
'parents': bucketNames.parents,
'permissions': bucketNames.permissions,
'prefix': prefix,
'resources': bucketNames.resources,
'roles': bucketNames.roles,
'users': bucketNames.users
}))
.then(function() {
if (!_.isUndefined(callback)) {
callback(null, db);
}
})
;
}
createTables()
buckets.js
'use strict';
var _ = require('lodash');
var buckets = function(options){
return _.extend({
meta: 'meta',
parents: 'parents',
permissions: 'permissions',
resources: 'resources',
roles: 'roles',
users: 'users'
}, options);
};
exports = module.exports = buckets;
当我 运行 node acl.js
我得到以下错误:
> node acl.js
{ development:
{ client: undefined,
connection: { user: undefined, password: undefined, database: undefined } } }
undefined
C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\node_modules\knex\lib\index.js:49
if (arguments.length === 0 || !config.client && !config.dialect) {
^
TypeError: Cannot read property 'client' of undefined
at Knex (C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\node_modules\knex\lib\index.js:49:40)
at Object.<anonymous> (C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\src\config\db.js:8:29)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Module.require (module.js:517:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (C:\Users\admin\Desktop\Coding Projects\learning_npm_node_acl\node_acl\acl.js:5:14)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Function.Module.runMain (module.js:609:10)
错误来自我的 acl.js
文件中的 const knex = require('../src/config/db');
行。
我的 db.js
文件如下所示:
require('dotenv').config()
// Loading from an external file
const config = require('../../knexfile')
console.log(config)
const env = process.env.DB_ENV
console.log(env)
const knex = require('knex')(config[env])
knex.on('query', (queryData) => {
console.log(queryData)
})
module.exports = knex
如您所见,console.log
语句在上面显示的输出中主要返回 undefined
。
knexfile.js
正在从 .env file
knexfile.js
require("dotenv").config()
module.exports = {
development: {
client: process.env.DB_CONNECTION,
connection: {
user: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
},
},
}
.env
# Database
DB_CONNECTION=postgresql
DB_ENV=development
DB_USERNAME=root
DB_PASSWORD=root
DB_DATABASE=nodeacl
当我运行knex migrate:latest
或knex seed:run
种子和迁移文件运行完美。
对我出现上述错误有何建议?
当您 运行 knex migrate:latest
和 knex seed:run
时,它会起作用,因为您的文件 knexfile.js
与您的文件 .env
位于同一层文件系统。这意味着您的环境变量已正确导入。
你的文件acl.js
在同一级别吗?如果没有,也许你应该 运行 node /path/to/acl.js
从 .env
级别开始。