与 knex 的未定义数据库连接

Ann*_*lee 2 javascript postgresql node.js knex.js

我正在执行以下脚本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()
Run Code Online (Sandbox Code Playgroud)

桶.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;
Run Code Online (Sandbox Code Playgroud)

当我运行时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)
Run Code Online (Sandbox Code Playgroud)

错误来自const knex = require('../src/config/db');我的acl.js文件中的行。

我的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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这些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,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

.env

# Database
DB_CONNECTION=postgresql
DB_ENV=development
DB_USERNAME=root
DB_PASSWORD=root
DB_DATABASE=nodeacl
Run Code Online (Sandbox Code Playgroud)

当我运行knex migrate:latestknex seed:run种子和迁移文件完美运行时。

为什么我收到上述错误的任何建议?

Win*_*uen 5

当您运行knex migrate:latest和 时knex seed:run,它会起作用,因为您的文件knexfile.js.env文件系统中的文件位于同一级别。这意味着您的环境变量已正确导入。

您的文件是否acl.js处于同一级别?如果没有,也许您应该node /path/to/acl.js从该.env级别运行。