使用“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 语句,在同一个文件中

如何在 Sequelize ORM 中获取不带前缀表名的连接数据结果

Mongoose ORM 异步等待

51Nod1253 Kundu and Tree 容斥原理

51nod1445(最短路)

51nod2553 双重祖先