从database / config读取目录路径并公开为静态HTTP路径(nodejs express)

时间:2014-04-24 17:53:14

标签: node.js express

我正在使用nodejs并表达我的服务器端开发。我需要将存储库公开为静态路径。此存储库路径未经过硬编码并存储在数据库中。我有方法从数据库中读取配置。当我使用除app.js之外的其他地方时,这很有效。以下是我的示例代码。

从数据库读取配置密钥并作为静态HTTP公开的代码:

// for configuration
var AppUtilities = require('./server/utilities/AppUtilities');
app.configure(function() {

    // set up our express application. Only showing the code related to static HTTP

    app.use('/files', express.static(AppUtilities.appConfig.filesRepositoryPath)); //Expose repository as static content

});

app.listen(port);

AppUtilities.js

var documentOperationModule = require('./../persistence/DocumentOperation');
var constants = require("./../utilities/Constants");

//load application config from database and export as module.
documentOperationModule.getAllDocuments(constants.APPLICATION_CONFIG_COLLECTION, function(err, result) {
    if (!err) {
        console.log("loaded value from app config collection");
        exports.appConfig = result[0];
    } else {
        //throw error
        return new Error("Unable to load app config data error >> " + err);
    }

});

当我尝试启动nodejs时出现以下错误。

TypeError: Cannot read property 'filesRepositoryPath' of undefined

我是nodejs的新手。如果我无法澄清我的疑问,请帮助并告诉我。

1 个答案:

答案 0 :(得分:0)

问题是getAllDocuments()函数调用是异步的,所以直到你需要()AppUtilities.js之后才会完成。

解决方案是传递回调,例如:

// AppUtilities.js
var documentOperationModule = require('./../persistence/DocumentOperation');
var constants = require("./../utilities/Constants");

exports.loadAppConfig = function(cb) {
  documentOperationModule.getAllDocuments(constants.APPLICATION_CONFIG_COLLECTION, function(err, result) {
    if (!err) {
      console.log("loaded value from app config collection");
      exports.appConfig = result[0];
      cb();
    } else
      cb(new Error("Unable to load app config data error >> " + err));
  });
};



// Main entry point
var AppUtilities = require('./server/utilities/AppUtilities');
AppUtilities.loadAppConfig(main);

function main(err) {
  if (err)
    throw err;
  app.configure(function() {
    app.use('/files', express.static(AppUtilities.appConfig.filesRepositoryPath));
  });
  app.listen(port);
}