【问题标题】:Handling Node.js Async Returns with "require" (Node ORM)使用“require”(节点 ORM)处理 Node.js 异步返回
【发布时间】: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 

我觉得有一种明显的方法可以做到这一点。

【问题讨论】:

    标签: node.js orm require


    【解决方案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-ormhttps://npmjs.org/package/mysql

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2012-12-27
      • 1970-01-01
      • 2018-01-02
      相关资源
      最近更新 更多