我对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要求同步?
知道如何解决这个问题吗?
答案 0 :(得分:1)
const
是块作用域的,因此const
语句块中定义的两个if
变量只能在if
语句块中定义和使用。
基本上,您不能有条件地分配给{I}尝试做的const
,并且可以在块的范围之外使用变量。因此,您必须满足于使用非const类型(var
或let
)。我建议使用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);
}
}