在mongoose / mongodb

时间:2015-12-06 18:08:30

标签: mongodb express mongoose

我已经实现了Wall o'我的server.js中的代码,是时候开始将路由分成他们自己的文件了。我仍然在这里通过各种答案来了解如何做到这一点,但后来我想出了一个相关的问题。我认为这是回调地狱,或者它可能只是嵌套地狱,但如果可能的话,我想狡猾地离开它。

例如,当您向数据库添加Person时,可以将该Person链接到数据库中的任何其他Person,或者通过该链接添加它们。这意味着我的步骤是“拯救一个人”。是:

  1. 保存个人资料
  2. 为其他人提取var
  3. 如果var不存在,请跳至结束
  4. 如果var存在,则搜索具有该id / name
  5. 的任何Person
  6. 如果找到Person,则将步骤#1中的Person添加到other-Person数据
  7. 如果找不到Person,请在步骤#2中使用名称创建new-Person
  8. 那很多筑巢。我还有其他类似的多步路由,特别是删除:删除条目=删除条目的ref id中的事件。删除Person =循环遍历Event集合中的所有Change-History对象,以查找与该Person相关的任何对象。 (当我不大声说出来时,这更有意义,而且看起来要复杂得多。)

    所以我的问题是:如果我嵌入路由使我的server.js文件变小,是否有办法调出这些重复步骤,而不是总是拼写出来的东西? Frex,如果我可以采取类似的东西:

            Event
            .find({
                'change.person_id': req.params.person_id,
                user_id: req.params.user_id
            })
            .select({
                entry: 1,
                date: 1,
                title: 1,
                order: 1,
                change: 1
            })
            .exec(function(err, events)
    

    并使其成为自己的小函数,因此我可以将该动作封装在router.route文件中,如下所示:

            .get(function(req, res) {
                    fetchEvents(userId, personId);
                    if (err) {
                        return res.json(err);
                    } else {
                        res.send(events);
                    }
            });
    

    这可能吗?

    同样重要的是,是否有任何维护或性能问题会使这个想法变得糟糕?

1 个答案:

答案 0 :(得分:0)

制作更多可组合异步调用的快捷方法是使用Promises。 Mongo javascript驱动程序会返回一个承诺,如果你没有提供回电以便开始,但我发现Promises不会使用我习惯的语法(即他们似乎缺乏捕获声明。)

所以另一种方法是使用Bluebird并宣传你的功能,你可能最终会这样做。

var Promise = require("bluebird");
var mongoConnect = Promise.promisify(mongoClient.connect);
var db;

...(req, res) => {
  mongoConnect(uri)
  .then( _db => {
    db = _db;
    // 1st async operation
  })
  .then( res => {
     // second async ....
  })
  .then( result => {
    // close connection
    db.close();
    res.send(result)
  })
  .catch( err => {
    if (db.close)
        db.close();
    return res.status(5000.send(err);
  });
}