Articles of bluebird

如何使用Node.js上的co模块捕获exception?

我在帆框架上使用co模块进行编码。 我想捕获InvalidError,但错误日志说'未定义'。 我怎样才能解决这个代码? Co模块不能捕获ErrorType规范? detail: function (req, res) { co(function *() { let errors = []; const text = req.param('text'); if (text.length <= 0) { throw new InvalidError('text is required'); } }).catch((InvalidError, err) => { sails.log.warn(err); errors.push(err.message); req.flash('errors', errors); res.redirect('/somewhere/view'); }).catch((Error, err) => { sails.log.error(err); res.serverError(err); }); } 错误日志在这里 warn: undefined error: undefined error: Sending […]

从承诺中的callback中检索数据?

我现在有以下一段代码: const Promise = require('bluebird'); const readFile = Promise.promisify(fs.readFile); recordPerfMetrics: function(url) { var self = this; var perf, loadTime, domInteractive, firstPaint; var perfData = {}; readFile('urls.txt', 'UTF-8').then(function (urls, err) { if (err) { return console.log(err); } var urls = urls.split("\n"); urls.shift(); urls.forEach(function(url) { console.log(url); self.getStats(url).then(function(data) { data = data[0]; loadTime = (data.loadEventEnd – data.navigationStart)/1000 + […]

Sequelize JS / Bluebird:从asynchronous并行数据库调用开始

我有个问题。 我想开始2分贝的电话,然后继续承诺链。 我做的一个相当怪异的做法是像这样开始承诺: db.Model.find().then(function() { return [ firstcall, secondcall ] }).spread(function(resultFromFirstCall, resultFromSecondCall) { //do something once both calls completed }); 用空数据库调用启动promise链可以吗? 或者,还有更好的方法。 我知道我可以引入asynchronous库,但是我认为这是一个更清洁的方法,如果没有性能影响,使空的db.Model.find()调用。

为什么这个蓝鸟PG代码挂起?

我试图围绕蓝鸟诺言包裹头,并通过文档中的一些例子。 我目前的代码是基于这个例子 : var Promise = require('bluebird'); var pg = Promise.promisifyAll(require('pg')); var using = Promise.using; function getConnection(string) { var close; return pg.connectAsync(string).spread(function(client, done) { close = done; return client; }).disposer(function() { console.log('In disposer'); try { if (close) close(); } catch(e) {}; }); }; using(getConnection('/var/run/postgresql dc'), function(conn) { console.log('Got a connection'); return conn.queryAsync('SELECT 1'); }) .then(function(rows) […]

Express.js – foreach数据数组并将其存储在数据库中

我使用expressjs,bookshelf.js,我想发布数据数组,foreach这样的数据,并保存它。 我不是很确定问题在哪里(expression式,书架或简单的旧javascript),但是这里是这样的情况:当我发布所述数组并尝试迭代它时,我得到了正确的数据保存量,但都具有数组中最后一项的值。 代码如下: router.post('/save/', function(req, res){ var data = req.body; var result = []; for (var i in data) { var d = data[i]; if (d.user_id == -1) d.user_id = null; new Term().where({'date_of_driving': d.day}) .fetch() .then(function(terms){ if (terms != null) { return new Term({'id':terms.id}).save(d).then(function(item_updated){}); } else { return new Term().save(d).then(function(item_saved){}); } }) .catch(function(error){ console.log(error); }); […]

testing使用SinonJs和Mocha来限制包含Promise Code Block的Route Handler

我有一个restify行动代码块如下: function retriveAll(req, res, next) { db.user .find({where: {id: 1}) .then(function(user){ res.send(user); }) .catch(function(details){ res.send(details.message); }) .finally(function(){ next(); }); } 我想testing这个动作,具体validationres.send()在这个代码块中被调用 。 稍后validationres.send()返回的数据。 我正在使用SinonJs和Mocha进行testing框架。 以上是上述方法的示例testing代码块。 describe('retrieveAll()', function() { reqStub = {}; resStub = {send: sinon.stub()}; nextStub = sinon.stub(); beforeEach(function() { module.retrieveAll(reqStub, resStub, nextStub); }); // this doesn't work // and the sub.calledCount is 0 // […]

处理成功的HTTP承诺,如果一个蓝鸟失败

我对Promises相当陌生,一直试图让这段代码正常工作。 这是我的。 var Promise = require('bluebird'); Promise.join(getProducts, getPricing, function(products, pricing) { console.log('products: ' + products.body); console.log('pricing: ' + pricing.body); // Add pricing to products here res.send(products.body); }) .catch(function(e) { console.log(e); res.sendStatus(500); }); 要求… 我想同时调用这两个API,并在两个完成时处理结果。 如果定价API失败,我仍然希望返回没有定价的产品。 如果产品API失败,我想错误发送500回到客户端。 我的代码似乎工作,如果两个API调用都成功,但总是进入捕获,如果失败,并忽略任何成功的调用。 如果我使用同步Promise链,我可以很好地工作,但是我想同时调用这两个API。 我怎样才能asynchronous调用这两个API并在catch之外处理结果?

在蓝鸟承诺内执行asynchronous操作

所以,我一直在殴打这个几天,我很难解决什么是最好的解决办法。 我正在使用HAPI的Waterline / dogwater,并试图做一些大致的事情: wardrobe.find({WardrobeId: 5}).then(function(clothes) { //got my clothes in my wardrobe. clothes.find({Type: 'trousers'},{Kind: 'nice ones'}).then(function(trousers) { //got my nice trousers _.each(trousers, function(trouser) { //logic to see if these are my pink trousers console.log('color?', trouser.color); }); console.log('ding'); }); }); 我遇到的麻烦是代码在输出裤子颜色之前总是会ding 。 这是因为,尽我所知, _.each将使代码asynchronous。 我试图介绍承诺(蓝鸟),但没有运气。 我甚至看过发生器(Co),但是我的节点版本在v0.11之前是固定的。 我想在_.each执行一些数据库查询,将这些结果(如果有的话)返回给裤子对象,然后返回: wardrobe.find({WardrobeId: 5}).then(function(clothes) { //got my clothes in my […]

在Nodejs中使用asynchronous等待redis和bluebird

纠正我,如果我在这里错了。 这就是我所做的 client = Promise.promisifyAll(redis.createClient()) let reply = await client.getAsync('foo_rand000000000000') console.log('reply',reply.toString()) 我得到Unexpected token错误。 我有这个在我的.babelrc { "presets": [ "es2015", "stage-3" ] } 有人可以指出我在这里做错了吗?

节点,蓝鸟承诺,MySQL,并需要一个僵硬的饮料

我正在努力使用MySql实现Bluebird承诺。 我觉得我很接近,但是我的问题开始变得复杂起来,我可以利用一些帮助回到正轨。 我有这个代码所有的callback工作,但我已经承诺与承诺。 目前的问题是,它不喜欢我的查询“那么”,如在: conn.query("DO DB STUFF").then(function(result){}); 首先,我有一个看起来像这样的connection.js文件。 我在代码中添加了一些注释。 (function () { var mysql = require("mysql"); var pool = mysql.createPool({ connectionLimit: 10, host: "localhost", user: "myuser", password: "password", database: "dbName" }); // stole this from http://stackoverflow.com/questions/24797314/how-will-a-promisified-mysql-module-work-with-nodejs exports.getConnection = function(){ return pool.getConnectionAsync().disposer(function(connection){ try{ connection.release(); } catch (e) {} }); }; })(); 然后我有一个“db访问”文件,看起来像这样: var Promise = require("bluebird"); […]