使用“require”(Node ORM)处理Node.js异步返回结果

4
我是使用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(以及所有其他模型)放在外部包含文件中。
如果我做这样的事情: ```python from myapp.models import Person ``` 那么在包含文件中,我就可以使用Person模型了。
   require("./models/person.js");

我无法在其中使用db变量,因为它仅存在于orm.connect()的回调函数的上下文中。我也无法将orm.connect移动到require (person.js)中并对模型信息进行module.export,因为在父脚本中,require将会发生,然后模型将不会准备好下一行,因为它不会等待回调。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 

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

3个回答

7
也许可以将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" }
    });
}

这是一个很好的观点。我一直担心使用全局变量,但我没有考虑将数据库传递给 require。实际上,我确实考虑过,只是没有意识到这是可能的。我会尝试这样做,看看能否让它工作。 - NateDSaint
完全奏效了,很好的方法。我认为这就是ControlAltDel想要的,但由于没有意识到可以直接执行require的返回值并将参数传递到文件中,所以我没有完全理解。 - NateDSaint
那么,当您想要在两个模型之间创建关系时,该如何处理呢?您是否像这样将所需的模型作为参数传递?--> http://pastie.org/4189607 看起来很丑陋。 - Vinch

1

1
如果您将此处发布的代码放入一个函数中,就可以导出并在person.js中使用它(或者反过来)。

我在这里遇到的问题是,在 require 中无法异步使用 orm.connect(由 var db 表示)回调函数。因此,如果将其作为函数使用,则问题仍然存在,因为在回调返回之前就会调用它,或者在尝试执行之前,从 connect 返回的对象尚未初始化,因为它在尝试执行之前没有等待回调。 - NateDSaint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接