使用“require”(节点 ORM)处理 Node.js 异步返回
Posted
技术标签:
【中文标题】使用“require”(节点 ORM)处理 Node.js 异步返回【英文标题】:Handling Node.js Async Returns with "require" (Node ORM) 【发布时间】:2012-05-19 23:17:27 【问题描述】:我正在使用 Node.js ORM 模块:https://github.com/dresende/node-orm
我可以通过这样做来创建模型:
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"
);
);
问题是我想将 Person(以及所有其他模型)放在外部包含中。
如果我这样做:
require("./models/person.js");
我不能在其中使用 db 变量,因为它只存在于 orm.connect() 的回调函数的上下文中。我无法将 orm.connect 移动到 require (person.js) 并为模型信息执行 module.export,因为在父脚本中,require 会发生,然后模型将不会在下一行准备好,因为它不等待回调。浏览器
//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
我觉得有一种明显的方法可以做到这一点。
【问题讨论】:
【参考方案1】:也许可以将 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"
);
【讨论】:
这是一个很好的观点。我担心使用全局变量,我没有考虑将 db 传递给 require。实际上我做到了,我只是没有意识到这是可能的。我要试试这个,看看能不能成功。 完全有效,是处理它的好方法。我认为这就是 ControlAltDel 的目的,但我不太明白,因为没有意识到您可以使用传递到文件中的参数直接执行 require 的返回。 那么,当您想在两个模型之间创建关系时,您如何处理这种情况?您是否将所需的模型作为这样的参数传递? --> pastie.org/4189607 我觉得很难看。【参考方案2】:如果您将此处发布的代码放在一个函数中,您可以将其导出并在 person.js 中使用(或其他方式)
【讨论】:
我在这里遇到的问题是,将 orm.connect(由 var db 表示)回调在 require 中异步不可用。所以如果你把它变成一个函数,问题仍然是它在回调返回之前被调用,或者从connect返回的对象还没有初始化,因为它在尝试执行之前没有等待回调。【参考方案3】:Node-orm 不是很好。 Node-mysql 驱动程序具有本机实现,但 node-orm 没有。 您可以使用 light-orm 作为 node-mysql 的包装器。您将获得非常灵活的模型。
https://npmjs.org/package/light-orm 和 https://npmjs.org/package/mysql
【讨论】:
以上是关于使用“require”(节点 ORM)处理 Node.js 异步返回的主要内容,如果未能解决你的问题,请参考以下文章
我如何在节点 js 中使用 require 和 import 语句,在同一个文件中