处理Node.js使用“require”(节点ORM)的asynchronous返回

我正在使用Node.js ORM模块: https : //github.com/dresende/node-orm

我可以通过这样做来创build一个模型:

var orm = require("orm"); var db = orm.connect("creds", function (success, db) { if (!success) { console.log("Could not connect to database!"); return; } var Person = db.define("person", { "name" : { "type": "string" }, "surname": { "type": "string", "default": "" }, "age" : { "type": "int" } }); }); 

问题是,我想把人(和所有其他模型)在外部包括。

如果我做这样的事情:

  require("./models/person.js"); 

我不能在里面使用dbvariables,因为它只存在于orm.connect()的callback函数的上下文中。 我不能移动orm.connect到require(person.js)并为模型信息做一个module.export,因为在父脚本中,require会发生,然后模型将不会被下一行准备好,因为它不在等待callback。 IE

 //person.js // db and orm get defined up here as before Person = {}; // code from above, with the define and etc. Module.exports = Person; //app.js person = require("./models/person.js"); console.log(person); // returns undefined, connect callback isn't done yet 

我觉得有一个明显的方法来做到这一点。

也许可以使person.js的导出到一个函数,并通过db? 喜欢这个:

 //app.js var orm = require("orm"); var db = orm.connect("creds", function (success, db) { if (!success) { console.log("Could not connect to database!"); return; } var Person = require("./models/person.js")(db); }); //person.js module.exports = function(db){ return db.define("person", { "name" : { "type": "string" }, "surname": { "type": "string", "default": "" }, "age" : { "type": "int" } }); } 

如果你把你在这里发布的代码放在一个函数中,你可以导出它,并在person.js中使用它(或者反过来)

Node-orm不太好。 Node-mysql驱动程序具有本地实现,但node-orm不具有本地实现。 你可以使用light-orm作为包装到node-mysql。 你会得到真正灵活的模型。

https://npmjs.org/package/light-orm和https://npmjs.org/package/mysql