Articles of 诺

使用Mongoose承诺find并更新

我正在尝试使用Mongoose Promises来获得更清晰的代码(请参阅嵌套函数)。 具体来说,我试图build立这样的事情: Model.findOne({_id: req.params.id, client: req.credentials.clientId}).exec() .then(function(resource){ if (!resource) { throw new restify.ResourceNotFoundError(); } return resource; }) .then(function(resource) { resource.name = req.body.name; return resource.save; <– not correct! }) .then(null, function(err) { //handle errors here }); 所以,在其中的一个承诺,我将需要保存我的模型。 从最新的稳定版本开始,Model.save()不会返回一个promise(bug在这里 )。 要使用经典的保存方法,我可以使用这个: //..before as above .then(function(resource) { resource.name = req.body.name; resource.save(function(err) { if (err) throw new Error(); […]

Node中带有error handling的多重承诺

我怎样才能避免在Node.js中的服务调用链的嵌套地狱,我想抛出一个给定的错误,并在某些情况下退出整个链? 这是一个链的例子: 加载Mongoose对象。 如果加载失败, res.send(404) ; 如果加载成功,则转到下一个then() 。 呼叫第三方API来获取一些数据。 如果API调用失败,请发送正确的响应(比如,为了解决这个问题,正确的状态码是500 ) 如果API调用成功,则呈现该页面。 SomeMongooseModel.findOne({id:123}).exec() .then(function(response) { // If group is empty, would like to res.send(404) and resolve the // promise immediately. }) .then(function(response) { // Hit 3rd party API to retrieve data. If there's an issue, return // response code of 500 and resolve promise immediately. […]

将async.eachLimit转换为promise

我有这样的同步代码 async.eachLimit(teams, 1000, fetchTeamInfo, exit) 我需要将其转换为Promise(蓝鸟) 我认为会很好做出类似于: Promise.method (teams, 1000, fetchTeamInfo) -> async.parallelLimit arr.map((a, i) -> -> iterator a, i, arr ), limit 但不确定是否正确

mongoose.Promise和promisifyAll有什么区别?

对于NPM Bluebird Promise库包,实现Mongoose承诺有两种方式。 这两者有什么不同? let bluebird = require('bluebird'); let mongoose = require('mongoose'); bluebird.promisifyAll(mongoose); 与: let bluebird = require('bluebird'); let mongoose = require('mongoose'); mongoose.Promise = bluebird;

链接承诺更新Mongoose中的参考文档

鉴于以下模式: user { uid:12345, name:myname, account=null } account { _id:6789, name:"myaccount", _owner:12345 } 如何更新user.account以使其引用字段的值为account._owner。 当账户文件被创build时,我想查找并replaceuser.account的值。 我有这样的路线: app.post('/accounts', authenticate, (req, res) => { var account = new Account({ name: req.body.name, _owner: req.body._owner, }); account.save().then((doc) => { //here i wasnt to update a refernce to a // an account field in a User document and set //it […]

节点承诺链似乎在string匹配中被破坏,如何解决?

现在我一直在研究下面的代码。 我对Promises和asynchronous代码相当陌生,但是我在这里和其他地方阅读了一些非常方便的post,在创build下面的代码的过程中描述了他们。 其目的是创build一个函数来检测文章中的作家插入链接标签的文章,并正确地将其replace为另一篇具有相同名称的文章的链接(如果存在)。 在这种情况下,文本标签链接到另一篇名为articleName文章将被写为<<articleName>> – 我知道风格<<texthere>>可能会导致一些问题,但实际的标签本身可以改变。 我只是想要文本replace正确返回,所以我可以传递新的string到响应被呈现。 我对这个问题感到不知所措,在这里 – 似乎在linkedArticle通过后的某个时候,承诺链被打破了。 我在想,使用正则expression式匹配(我已经使用string.js between函数,以及相同的结果)不适用于Promise.resolve() 。 我得到的输出只是一个匹配的matchedArray的stringundefined 。 我可能是过度的return和Promise.resolve() ,我不知道。 我正在使用Node.js和Mongoose。 我玩过使用原生承诺, async , string.js和underscore 。 下面的代码使用async和string.js。 我已经整理了下面的代码,尽可能在这里发布。 对于通过+吨的回报和解决(这可能是我的问题很可能是一个原因?)的长期论点道歉。 这是我正在做的事情之一,检查哪里可以打破链条; 我保留这篇文章只是为了分离一些东西,希望提高可读性。 文章模式是一个简单的介绍string入口,这是我用于testing的目的。 //Show article var show = (req, res, next) => { let id = req.params.id; Article.findOne({_id : id}).populate('_author').then(function(article) { if (!article) return res.render('404'); return Promise.resolve(replaceTextLinks(article.introduction)).then(function(text){ console.log("Returned text […]

使用asynchronouswhile循环创build和插入文档

我试图生成令牌,并将其保存到数据库,因为我这样做。 这是生成令牌的代码。 const generateToken = function (maxUse) { // 12 digit token numbers. 9e+11 possibilities const min = 100000000000; const max = 999999999999; const token = Math.floor(Math.random() * (max -min) + min); // ensure token doesn't exit exist in db before saving Token.count({ token }, function (err, count) { if (count > 0) { generateToken() […]

在Mongoosepath中使用Promise

我理解JavaScript中的承诺或至less我认为我(如果我错了纠正我)。 创造一个承诺: var promise = new Promise(function(resolve, reject){ // do something async here if(itWorked){ resolve(); }else { reject(); } }); 使用承诺: promise.then(function(result){ },function(err){ }); 我有一个基于MEAN Stack的应用程序,我的一些mongoose路线正在成为一个回拨地狱。 我想摆脱mongoose路线的callback,并使用承诺来处理它们。 但我似乎无法弄清楚究竟是怎么做到的。 例如: app.get('/users', function(req, res){ User.findOne(_id, function(err, user){ if(err) console.log(err) else if(user){ Receipt.findOne(user.bookName, function(err, book){ if(err) console.log(err) else if(book){ // again do something here } }) } }) […]

打破mongoose的蓝鸟诺言链

我已经研究了几个相关的问题和答案,仍然无法find我想要做的解决scheme。 我正在使用Mongoose和Bluebird来承诺。 我的承诺链包含3个部分: 通过用户名获取用户1 如果find用户1,则通过用户名获取用户2 如果find用户1和用户2,则存储新的logging 如果步骤1或步骤2无法返回用户,我不想执行步骤3.但是,无法返回用户不会导致数据库错误,因此我需要手动检查有效的用户。 我可以在步骤1中使用Promise.reject() ,它会跳过第2步,但仍然会执行第3步。其他答案build议使用cancel() ,但我似乎无法做到这一点。 我的代码如下。 (我的函数User.findByName()返回一个promise。) var fromU,toU; User.findByName('robfake').then((doc)=>{ if (doc){ fromU = doc; return User.findByName('bobbyfake'); } else { console.log('user1'); return Promise.reject('user1 not found'); } },(err)=>{ console.log(err); }).then((doc)=>{ if (doc){ toU = doc; var record = new LedgerRecord({ transactionDate: Date.now(), fromUser: fromU, toUser: toU, }); return record.save() } else […]

无法获取蓝鸟许诺和mongoose的save()在node.js中工作

任何人都可以帮助我弄清楚如何在承诺中重写以下工作代码? 我想执行一个插入查询,然后通过socket.js将数据发送回客户端 var func = require("functions") var mongoose = require('mongoose'); var mongo_models = require('./database/mongo_model')(mongoose); var Promise = require("bluebird"); socket.on("submit",function(d){ if(d[0].src !== undefined) { var data = func.clear(sanitizer,d), tab = new mongo_models.Tab({avg:0,post:data}); tab.save(function(err,tw){ io.sockets.in('index').emit("update",tw) }) } }); 我已经尝试了下面的代码,但我从console.log(b)得到undefined 。 显然save()没有返回任何结果。 诺言: socket.on("submit",function(d){ if(d[0].src !== undefined) { Promise.props({ one: func.clear(sanitizer,d) }).then(function(a){ return new mongo_models.Tab({avg:0,post:a.one}).save(); }).then(function(b){ console.log(b); // […]