我有node.js应用程序,它是在express.js框架上构建的。
const app = express();
require('./config')(app);
require('./services')(app);
./ config / config.js我们实例化config:
module.exports = function (app) {
const conf = {APIKey: 1234567890, url: '<someurl>'};
app.set('config', conf);
};
./services/APIService.js我们创建服务实例(单例)
module.exports = (app) => {
app.set('apiService', new APIService(app));
};
function APIService(app) {
const config = app.get('config');
this.key = config.APIKey;
};
APIService.prototype.sendRequest = () => {
const config = app.get('config');
this._send(config.url, 'some text');
};
或者,service2
module.exports = function(app) {
const config = app.get('config');
const myMod = require('myMod')(config.APIKey);
}
很酷,一切正常。但有时管理员会更改一些配置数据。所以,我们创建新配置,将他设置为
newConf = {APIKey: 1234000000, url: '<some_new_url>'};
app.set('config', newConf);
APIService.sendRequest ,会向CHANGED网址发送请求,但 APIService.key 仍未更改。并且 myMod 已经使用旧配置数据进行了实例化。
我们需要写一些setter方法,比如这个
//for APIService
APIService.prototype.setConfig = () => {
const config = app.get('config');
this.key = config.APIKey;
};
//for service 2
/* change const myMod to let myMod and create method for overriding */
或 bang! kill并重新启动node.js服务器进程。馊主意。可能存在一些实现此目标的方法,例如 app.restart(),以便安全地重新初始化应用程序(或者,可能是他的部分)?
答案 0 :(得分:0)
您是否尝试再次致电app.set('apiService', new APIService(app));
?或者只是在你的参数的原型上有吸气剂和二传手。
更好的方法是在每个新请求中使用中间件创建一个新的APIService对象,例如:
app.use(function (req, res, next){
req.api = new APIService(app);
next();
});
并使用req.api。