Articles of 承诺

Node.js链接与MySQL的循环承诺

我正在尝试将一个非关系数据库变成一个关系数据库。 所以我从没有唯一ID的数据开始。 我需要从一个SQL调用循环中通过这些行得到结果,并且对于每一个,使用第一个结果的一部分执行SQL SELECT,然后使用下一个结果执行另一个SQLselect,然后使用来自第一个最后的查询。 我正在使用Node.js和ES6承诺保持一切顺序,但我似乎失去了一些东西。 实际上,我正在尝试执行额外的SQL调用,并且在第三个查询中也使用了这个结果,但是我正在简化它,只是让一个调用进入另一个调用。 也许一些代码将帮助显示我正在尝试做什么。 这是我的查询类返回承诺: var mysql = require('mysql'); class Database { constructor() { this.connection = mysql.createConnection({ host: "localhost", user: "root", password: "root", database: "pressfile" }); } query(sql, args) { return new Promise((resolve, reject) => { this.connection.query(sql, args, (err, result, fields) => { if (err) return reject(err); resolve (result); }); }); } […]

Node.js未被捕获的套接字exception – 套接字已closures

这是问题。 在写入一个封闭的套接字的时候,我得到一个exception,并且这个exception没有被try catch捕获,大概是因为它在promise中。 promise.then(function (val) { try { sock.write(val + tcpDelimiter); } catch (err) { logger.info('yeah right this will not work at all'); } }) .fail(function (error) {}); 而且,将process.uncaughtexception添加到主应用程序也无济于事。 这是控制台输出: 2012-10-04T19:22:21.109Z – error: uncaughtException date=Thu Oct 04 2012 19:22:21 GMT+0000 (UTC), pid=21508, uid=0, gid=0, cwd=/home/ec2-user/js-proxy, execPath=/usr/bin/nodejs, version=v0.6.18, argv=[/usr/local/bin/node, /home/ec2-user/js-proxy/app.js, –jsproxy], rss=13914112, heapTotal=5634752, heapUsed=4082564, loadavg=[0.0380859375, 0.08056640625, […]

Node.js,mongo,promise – 将parameter passing给then函数

使用node.js,而不是callback,通过指定用户ID从mongo中检索用户对象。 Db访问使用require('mongodb').Db 。 调用从下面的代码的底部开始: findByIdPromise(userId) collection.findOne()需要userId作为参数,但是then()以promise作为单个参数来调用一个函数。 为了绕过这个限制,我传递了一个具有userId属性预设的对象finder ,以及一个采用集合promise的函数findUser ,并调用集合的findOne ,并将其传递给预设的userId。 这是一个体面的方法吗? UserProvider.prototype.getCollectionPromise = function () { var deferred = q.defer(); var resolve = deferred.resolve; var collectionCallback = function (error, usersCollection) { if (error) { throw new Error(error); } else { resolve(usersCollection); } }; this.db.collection(CollectionName, collectionCallback); return deferred.promise; }; UserProvider.prototype.findOnePromise = function () { var userId; […]

承诺返回值和嵌套

我有一个函数createOne()应该试图find一个MongoDB文档或创build它,如果找不到。 无论哪种方式,都应该返回一个承诺,并用doc解决承诺: var createOne = function(category) { var self = this; return this.findOne({ slug: category.slug }).exec() .then(function(doc) { if (!doc) { return self.create(category); // wait to resolve until document created. } }); }; findOne().exec()和create() (应该)都返回一个promise。 我尝试了很多不同的方法,比如使用Q.fcall,用Q.defer()和其他方法手动创build一个,但是parsing值丢失,或者创build了第二个{ slug: 'foo' } ,即使首先已经存在(?)。 以下是我的通话代码: var data = [ { slug: 'foo' }, { slug: 'bar' }, { slug: […]

node.js推迟了误解

我正在学习q.js并试图同时查询3个集合(避免callback地狱): var Q = require('q') var deferred = Q.defer(); users()是db.collection.find()的包装器 var users = function (){ Auth.listUsers({role:'user'}, call) return deferred.promise } call()是导出promise的简写 var call = function (err,data){ if (err) { deferred.reject(err); } else { deferred.resolve(data); } } loop()是主循环,它获取游标并循环通过条目 var loop = function (result) { var list = [] var promises = []; result.each(function (err,data){ if (err) […]

不同的承诺期间不同的redirect失败原因错误:无法调用http.ServerResponse.end()

我有一连串的承诺,可能在不同的点失败。 根据失败的地方,我可能希望它做不同的事情。 在一些地方,我可能想渲染一个页面,其他地方redirect。 我发现的问题是,当它运行所有的失败函数,然后有http.ServerResponse.end()被调用无数次的错误。 例: Parse.Promise.as(1).then(function() { if (apples) { return apples.fetch().fail(function() { res.redirect('/somewhere') } ); } else { return {}; } }).then(function() { // doing other stuff },function() { res.redirect('/elsewhere'); }).fail(function() { res.render('error.ejs'); }); 我应该以不同的方式做这个吗? (我从(1)开始只是为了进入承诺链,因为有两个不同的苹果和苹果的起始情况,都需要继续下一部分的链,但只有其中一个可以启动链{}不能,不知道这是否是最好的方法。)

Node.js + Bluebird + csv:额外项目

我有下面的代码下载CSV文件: function download_csv(symbol) { var req_url = url + '&s=' + symbol var filename = '/prices/' + symbol + '.csv' return request.getAsync(req_url) .then(function(resp) { fs.writeFileAsync(filename, resp) }) } Promise.map(symbols, download_csv, {concurrency: 128}) .error(function(e) {console.error('error ocurred: ', e.message)}) .done(function() {console.log('done')}) 当我打开csv文件时,第一行右移1列: [object Object] Date Open High Low Close Volume Adj Close 第一列应该说Date,而不是[object Object]。 我的代码中有什么错误?

当/节点liftAll不工作的S3对象

我正在尝试使用when/node提取Amazon S3对象中的所有函数。 var when = require('when'); var nodefn = require('when/node'); var AWS = require('aws-sdk'); var s3 = new AWS.S3(); var promisedS3 = nodefn.liftAll(s3); when(promisedS3.listBuckets()) .then(function(data) { console.log(data); }) 但是,它看起来像一个请求对象正在打印出来。 我对这里正在发生的事情感到不知所措,如果我单独提起这样的function,我可以得到正确的结果: var listBucketsP = nodefn.lift(s3.listBuckets.bind(s3)); 有任何想法吗?

改进node.js代码(后缀,承诺和护照)

我是node.js中的新手,续集,蓝鸟许诺和FBauthentication。 我想坚持我的FBauthentication用户身份validation的细节。 在我的模型中,一个用户可以同时拥有多个身份validation(一个用于浏览器,另一个用于移动设备等)。 我需要照顾这些authentication,所以我有下一个关系: User.hasMany(AUTH); Auth.belongsTo(用户); 我写了这个代码,但我仍然在寻找一个更聪明的解决scheme。 主要目标是将authentication信息添加到用户。 所以,在validation信息之前,我寻找一个持久的用户。 function(accessToken, refreshToken, profile, done) { console.log("FacebookStrategy_function:\naccessToken: " + accessToken); var thatUser=null; User.find({ where: { username: profile.username }, include: [{model: Auth}] }).then(function(user) { console.log("USER IS #1: %j", user); if(user!= null){ // User found in database console.log("User " + profile.id + "found in database"); return user; }else{ // […]

Promise:循环后执行

我想用水线ORM在循环中创build几个条目。 每个创build的对象被推入一个数组中。 所有对象创build完毕后,我需要返回完整的数组。 这是我的代码: share: function(req, res, next) { var params = {}, id = req.param('id'), img = {}, targets; if (!req.param('name')) { res.status(400); return res.json('Error.No.Name') } var promiseLoop = function(Tree) { // Function called after creating or finding Tree to attach to var array = []; if(!req.param('targets')) return Tree; // No targets provided => […]