异步加载 NPM 模块
Asynchrously load NPM module
我正在尝试创建一个连接到我的数据库的模块(使用Cradle的couchDB)。最后,模块导出"db"变量。
这是代码:
var cradle = require('cradle'),
config = require('./config.js');
var db = new(cradle.Connection)(config.couchURL, config.couchPort, {
auth: {
username: config.couchUsername,
password: config.couchPassword
},
cache: true,
retries: 3,
retryTimeout: 30 * 1000
}).database('goblin'); //database name
//Check if DB exists
db.exists(function (err, exists) {
if (err && exists) {
console.log("There has been an error finding your CouchDB. Please make sure you have it installed and properly pointed to in '/lib/config.js'.");
console.log(err);
process.exit();
} else if (!exists) {
db.create();
console.log("Welcome! New database created.");
} else {
console.log("Talking to CouchDB at " + config.couchURL + " on port " + config.couchPort);
}
});
module.exports = db;
问题是 db.exists 调用是异步的,如果它不存在,我认为变量会在完成之前导出变量,从而影响系统的其余部分。
它以正常方式包含在执行的节点页面中:
var db = require('./couchdb.js');
有没有办法防止这种情况发生,或者有任何最佳实践可以在没有巨大的嵌套回调的情况下解决这样的问题?
作为参考,您可以在此处查看整个应用程序(https://github.com/maned/goblin),以及此处(https://github.com/maned/goblin/issues/36)引用的项目错误。
采用异步样式。 不要从模块导出db
,而是导出异步函数,如下所示:
module.exports = {
getDb: function(callback) {
db.exists(function(err, exists) {
if (exists && !err) {callback(db);} else { /* complain */ }
});
}
};
现在,应用程序可以只require('mymodule').getDb(appReady)
appReady
接受已知有效且可用的db
对象的位置。
相关文章:
- 尽管链接成功并已成功下载,但未找到NPM模块
- 在Meteor项目中安装并包含npm模块后出错
- 限制npm依赖模块's require(隔离)的用法
- 在Meteor Angular 1.3中使用npm模块
- Webpack通过npm将代码拆分为单独的模块,以及如何编译es6
- 有没有人能够得到这个要求或调试NPM模块在浏览器中工作
- 如何访问npm模块抛出的自定义错误对象[error:[object object]]
- NPM:取决于本地 ES6 模块(无转译)
- 利用异步 NPM 模块
- 异步加载 NPM 模块
- 将迁移的Silverlight到HTML应用程序划分为NPM模块
- 如何让我的ember.js应用程序导入从bower或npm安装的模块
- 将MQTT NPM模块导入NativeScript
- 别名带有浏览器化填充码的 npm 模块
- NPM:将多个模块和自定义脚本与browserfy相结合
- "npm运行构建“;模块解析错误”;您可能需要一个适当的加载程序来处理此文件类型&”;
- 如何使用NPM模块
- Npm.require可以'找不到节点模块
- 全局安装的NodeJS npm模块不执行节点的主/bin JavaScript文件
- npm->错误:找不到模块'可读流'