在课堂上需要Node问题

时间:2018-05-25 16:50:47

标签: node.js

我对Node很新,并且编写了一个带有测试的应用程序,我遇到了一个场景,我不需要加载2个软件包进行测试(因为它们无法加载软件包,因为它们需要一些二进制文件,这些二进制文件不会出现在测试环境中。我将环境变量TEST设置为true,让应用程序知道它应该加载这两个包,并且测试运行完美。但是,对于生产,我得到的包没有加载。

这是我的班级代码:

"use strict";
const config = require('../../config/mainConfigs');

...Other constants...

if (typeof process.env.TEST === 'undefined' || process.env.TEST === null){

    const mssql = require('mssql');
    const oracle = require('oracledb');

    if (process.env.DB_PASS && process.env.DB_PASS != '') var db_pass = process.env.DB_PASS;
    else if (config.Logging.DB.password != '') var db_pass = config.Logging.DB.password;
    else {
        console.error(`There's no database password set. Use either Enviroment Variable "DB_PASS" or set "password" under "Logging" > "DB" in configuration file.`);
        process.exit(1);
    }

}

class db {

    constructor(){
        this._pool = null;
    }

    get_pool(){

        if (process.env.TEST) return new Promise((resolve)=>resolve());

        if (config.Logging.DB.type == 'mssql'){

            if (!this._pool) {
                this._pool = new mssql.ConnectionPool(sqlDbOptions);
            }

            if (!this._pool.connected){
                return this._pool.connect();
            }
            else{
                return new Promise((resolve, reject) => {
                    resolve(this._pool);
                })
            }

        }else if (config.Logging.DB.type == 'oracle'){

            if (!this._pool || this._pool.connectionsOpen == 0){
                return this._pool = oracle.getConnection(oracleDbOptions);
            }
            else{
                return new Promise((resolve, reject) => {
                    resolve(this._pool);
                })
            }

        }

    }
... MORE CLASS OPERATIONS...
}

module.exports = db;

然后我在我的应用程序中使用这样的数据库:

const db = require('./db_class');
const db_instance = new db();

启动应用程序时,我会在启动服务器之前调用get_pool()方法建立连接。

但由于某种原因,我得到了:

  

ReferenceError:未定义mssql       在db.get_pool(C:\ Users ... \ src \ db.js:122:34)

如果我在if之外移动需求(检查是否设置了env变量的那个)它可以正常工作。

Aren要求同步?

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

const是块作用域的,因此const语句块中定义的两个if变量只能在if语句块中定义和使用。

基本上,您不能有条件地分配给{I}尝试做的const,并且可以在块的范围之外使用变量。因此,您必须满足于使用非const类型(varlet)。我建议使用let,这样您就可以准确地确定要在其中声明的范围,并在该显式范围内声明变量。然后,您可以在if块中分配先前声明的变量。

这是一个常见的解决方法:

let mssql, oracle;
if (typeof process.env.TEST === 'undefined' || process.env.TEST === null){

    mssql = require('mssql');
    oracle = require('oracledb');

    if (process.env.DB_PASS && process.env.DB_PASS != '') var db_pass = process.env.DB_PASS;
    else if (config.Logging.DB.password != '') var db_pass = config.Logging.DB.password;
    else {
        console.error(`There's no database password set. Use either Enviroment Variable "DB_PASS" or set "password" under "Logging" > "DB" in configuration file.`);
        process.exit(1);
    }

}