我正在使用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的新手。如果我无法澄清我的疑问,请帮助并告诉我。
答案 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);
}