Articles of 承诺

使用promisefiy时出错

我使用promisifyAll到以下模块,因为我想使用它与承诺,我得到错误“TypeError:不能读取属性'然后'未定义” const DBWrapper = Promise.promisifyAll(require("node-dbi").DBWrapper); var dbWrapper = new DBWrapper('pg', dbConnectionConfig); dbWrapper.connect(); dbWrapper.insert('USERS', data, function (err, data) { if (err) { console.log("error to insert data: " + err); } else { console.log("test" + data); } }).then(() => { //read data dbWrapper.fetchAll("SELECT * FROM USERS", null, function (err, result) { if (!err) { console.log("Data came back […]

如何promisify一个不包含callback参数的函数?

我目前正在工作一个API /路由器将被集成在用户自己的networking服务器。 我的代码将完成其所需的工作,但也允许用户实现自己的逻辑,如在这个片段: myApi.on('action', (err, result, req, res) => {/*user's logic here*/}) 。 通过devise,如果用户决定重写默认行为并实现自己的逻辑,我的代码将不会结束响应。 这是为了允许用户在需要时响应下一个中间件function。 我期望的控制stream程是: 运行我的初始路由逻辑 运行用户的自定义逻辑 如果响应尚未结束,则将控制权交给下一个中间件function 我的问题出现在用户想要实现任何asynchronous逻辑时。 在将控制权交给下一个中间件function之前,我无法让用户的定制逻辑结束。 我相信这是因为我设置的界面。 我希望尽可能less的忙碌工作由用户来执行。 这意味着我不希望传递给用户一些他们需要在逻辑的每个端点上调用的callback()或next()函数的等价物(因为我的路由器涉及许多不同的路由)。 我已经研究了promisify-node等承诺包装器,但是他们似乎只能包装那些以callback为最终参数的函数。 我也考虑要求用户从自定义实现中返回一个承诺,但是这违背了我不希望繁忙/样板代码的愿望。 有什么方法使用承诺 – 或任何其他构造 – 我可以处理这个asynchronous问题,而不必痛苦用户?

将价值从Promise返回Promise.All

我正在Node js Express中创build一个函数,客户端会调用它来下载内容。 内容需要从不同的来源下载,只有当所有下载完成(节点下载的内容被压缩并发回到呼叫客户端)时才需要发送回应。 所以,所有的下载function都包装在Promise.all(download1(),download2(),download3()) 其中一个下载function不仅下载内容,而且还生成一个json并将其发送回主函数。 主函数将其设置为响应头。 客户端调用的API函数看起来像这样 function downloadAll(request, response) { // Download content only after folders are created return createDirPromise.then(function (result) { var statusJson = … // somehow get the status json from download1() so that it can be send to the client return Promise.all([download1(contentsJson), download2(contentsJson), download3(contentsJson)]); }) .then(function (result) { return new […]

使用node.js中的Promise从s3桶下载图像

我想使用node.js中的Promises从本地系统的s3存储桶下载一些图像文件。 var params = { Bucket: bucket_name', Key: 'key' }; var fileStream = fs.createWriteStream('path/to/file.jpg'); 我试过这是工作 s3.getObject(params).createReadStream.pipe(fileStream); 但是我希望我的代码看起来像这样 return s3.getObject(params).promise() .then(function(data) { //console.log(data.Body); // No idea about this section }) .catch(function(err) { throw err; }); 我必须使用Promise来确保应该下载所有的图片。

Promisify自定义方法

我对Node和JS世界相当陌生。 我要实现的目标是“模块化”我的查询,并在各种情况下重用它们。 这是我的dbpipe理器: 'use strict' const mysql = require('mysql') var Promise = require('bluebird') var using = Promise.using Promise.promisifyAll(require('mysql/lib/Connection').prototype) Promise.promisifyAll(require('mysql/lib/Pool').prototype) const config = require('./config') var pool = mysql.createPool({ connectionLimit: 100, host: config.dbHost, user: config.dbUser, password: config.dbPassword, database: config.db, debug: config.dbDebug }) var getConnection = function () { return pool.getConnectionAsync() .disposer(function (connection) { return connection.release() }) } […]

节点serialport堆栈监听器,并没有得到完整的答复使用承诺

我遇到了一个问题,那就是我正在尝试使用的基于承诺的代码并不是每次都得到完整的响应。 我正在使用.on的数据侦听器,但将其更改为.once,因为testing显示每次调用都会堆叠数据侦听器。 但无论如何,我偶尔会得到部分答复。 那么我该如何解决这个问题。 不是堆栈监听器,但每次都得到完整的响应…并使用承诺来实现。 sendPort: function(port, src) { return new Promise((resolve, reject) => { // .once, not stacking but sometimes incomplete responses, .on stacking listener port.once('data', (data) => { resolve(data); // TODO parse data here or maybe after return }); port.once('error', (err) => { reject(err); }); // have same debug in .then after call […]

顺序承诺,同时传递价值

我正在玩命运API,我遇到了一些问题。 如果我请求一个字符的详细信息,它会返回一个对象,但是这些值是ID,然后需要将其传递给另一个API调用“清单”,该清单返回该ID的对象。 我正在使用'request-promise'来进行API调用,但这意味着我不得不嵌套调用,我不觉得高兴。 我需要保留一些来自第一个请求的数据,然后再打一个电话来获得最后一个数据。 例如: request('destiny-character-api') .then(character => { // Keep some of the data from character, eg className request(`destiny-manifest-api/${character.item}`) .then(item => { // Overwrite character.item with the value of item.name return item; }); }); 我需要一种方法来阻止第二个请求,直到第一个请求返回,然后将返回值传递给第二个请求。 谢谢

如何正确使用node.js中的asynchronous函数的承诺?

我在节点中有一个读取文本文件的asynchronous函数,把整个东西放到一个string中,将string拆分成每一行,把它们放到一个数组中,随机返回一个。 在这里我已经实现了一个新的Promise函数来处理它: exports.readTextFileAndReturnRandomLine = function readTextFile(file) { //reads text file as string, splits on new line and inserts into array, returns random array element return new Promise((resolve, reject) => { var fs = require('fs'); var textFile = fs.readFile(file, 'utf8', (err, data) => { if (err) { return reject(err); } else { var array = data.toString().split("\n"); […]

Node.js – 对promise.all()后的每个结果继续承诺链

我在承诺链中使用Promise.all() 。 Promise.all()中的每个promise都返回一个string。 即时通讯的问题是,Promise.all() 返回Promise对象到下一个承诺,我想继续对每个string承诺链。 下面是一个例子: …. return Promise.all(plugins); }) .then(function(response) { console.log(response) …. response如下所示: [ 'results from p1', 'results from p2' ] 有没有办法继续每个结果的承诺链,而不是继续使用包含所有结果的单个对象?

诺言创build,但不是从返回。 Knex / Bookshelf

每当我点击需要validation的路由时,我在控制台中都会收到警告消息。 (node:940)警告:在xxxxxx \ app \ config \ passport.js:15:19中的处理程序中创build了一个承诺,但未从其返回,请参阅http://bluebirdjs.com/docs/warning-explanations。 html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it at .fetch(xxxxxx \ node_modules \ bluebird \ js \ release \ method.js:13:13 ) 我configuration了这样的护照: const JwtStrategy = require('passport-jwt').Strategy; const ExtractJwt = require('passport-jwt').ExtractJwt; const secret = process.env.SECRET; var opts = {} function passportConfig(db, passport) { opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); opts.secretOrKey = secret; passport.use(new JwtStrategy(opts, payloadCallback.bind(null, db))); } function […]