【问题标题】:Get Nodejs Promise value for use in existing Framework object获取 Nodejs Promise 值以在现有框架对象中使用
【发布时间】:2018-03-14 07:53:24
【问题描述】:

这里是 JavaScript 业余爱好者。我编写了一个私有 NodeJS 模块来管理我们的数据库连接字符串(解密密码和连接字符串构造),但是由于解密的性质,该模块返回了一个对数据库连接字符串的承诺。

我们使用的是 Sails,配置发生在变量对象的导出中:

module.exports.variables = { dbstring: 'mongodb://user:password@host/mydb' }

但是现在有了承诺,在这里挤一个字符串有点棘手。我尝试将“module.exports.variables”块放在“.then”块中:

myConfigModule.getDBString('mysql-master').then( result => {
  module.exports.variables = { dbstring: result }
}

但随后 Sails 应用程序的其余部分无法启动,它试图访问“module.exports.variables”中的变量,并且只会得到“未定义”。我假设是因为应用程序的其余部分没有等待承诺被履行。

有什么建议吗?

【问题讨论】:

  • 能分享一下getDBString函数吗? module.exports 不会等待getDBString 承诺解决。在这种情况下,在解决 promise 之前已经导出了一个文件。

标签: javascript node.js promise sails.js


【解决方案1】:

我会从你的模块 getDBString 中导出一个函数,例如

配置模块 (config.js)

var getDBString = function() {
    /* Query DB, returning a promise. */
    return queryDB('mysql-master');
}

module.exports = {
    getDBString: getDBString
};

主模块

var config = require('/config.js');
config.getDBString().then((dbString) => {
    console.log('DB string: ', dbString)
});

【讨论】:

    【解决方案2】:

    设法解决了这个问题,但它主要是sails.js 特定的。 Sails.lift() 方法允许您传递覆盖配置,因此在 app.js 中,我可以使用我的承诺将数据库配置传递给 Sails 应用程序:

    myConfigModule.getDBString('mysql-master').then( result => {
      const sailsOverrideSettings.connections = {
        someMySQLServer: {
          url: result
        }
      };
      sails.lift(sailsOverrideSettings);
    })
    .catch ( err => {
      // Throw error up the stack.
      throw (err)
    });
    

    参考: https://sailsjs.com/documentation/reference/application/sails-lift

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 2019-09-18
      • 2018-06-14
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多