如何使用更好的saveAsync扩展Mongoose原型
How to extend Mongooose prototype with better saveAsync
我使用猫鼬和用promisifyAll
初始化的蓝鸟。这很酷,我喜欢承诺。但是mongoose的model.save()
返回了像(err, user, numAffected)
一样的函数签名,所以bluebird的model.saveAsync()
返回了一个双元素数组,而不是单独返回明显的结果。这使得链接变得不方便,所以我开始制作这样的小助手函数:
function saveUser(user) {
return user.saveAsync()
.spread(function (user, numAffected) {
return user;
});
}
在mongoose原型中进行承诺时添加它会容易得多,并且在整个应用程序中只需执行一次。。。但我不知道怎么做。
这将在3.0中修复,但现在您可以使用过滤器和自定义承诺器:
// Promisifies only methods named "save"
Promise.promisifyAll(require("mongoose"), {
filter: function(name) {
return name === "save"
},
promisifier: function(save, defaultPromisifier) {
var saveAsync = defaultPromisifier(save);
return function() {
return saveAsync.apply(this, arguments).spread(function(first) {
return first;
});
}
}
});
// Promisify rest of the mongoose... it will ignore save as it was already promisified
Promise.promisifyAll(require("mongoose"));
您可以修补user.saveAsync
var user_saveAsync = user.saveAsync;
user.saveAsync = function() {
return user_saveAsync.bind(this)() //-> same as calling `user.saveAsync()`
.spread(function(user) { // but now you're returning spreaded result
return user;
});
}
然后你就可以做了
function saveUser(user) {
return user.saveAsync();
}
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 使用promise和mongoose对文档进行排序
- 扩展移相器按钮类不工作
- chrome扩展中的navigator.geolocation.getCurrentPosition
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- chrome扩展更改主机/域警告
- TableExport jquery插件:文件名和扩展名问题
- 如何在chrome扩展中重定向到html页面
- Chrome扩展没有't在重新加载之前考虑期权价值
- 扩展SVGTextElement时出现Typescript Uncaught TypeError
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- Javascript”;类“;带有参数的扩展
- 试图阻止Chrome通过扩展关闭
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 表达式引擎扩展开发-向呈现的条目添加自定义javascript
- 如何缩短MongoDB ObjectId并在Mongoose模式中使用它
- 从选项页面更新chrome扩展清单权限
- 如何使用更好的saveAsync扩展Mongoose原型
- Mongoose是否不能通过文档数组编辑和版本控制进行扩展?
- Mongoose扩展默认验证