我已经实现了Wall o'我的server.js中的代码,是时候开始将路由分成他们自己的文件了。我仍然在这里通过各种答案来了解如何做到这一点,但后来我想出了一个相关的问题。我认为这是回调地狱,或者它可能只是嵌套地狱,但如果可能的话,我想狡猾地离开它。
例如,当您向数据库添加Person时,可以将该Person链接到数据库中的任何其他Person,或者通过该链接添加它们。这意味着我的步骤是“拯救一个人”。是:
那很多筑巢。我还有其他类似的多步路由,特别是删除:删除条目=删除条目的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);
}
});
这可能吗?
同样重要的是,是否有任何维护或性能问题会使这个想法变得糟糕?
答案 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);
});
}