node.js - 如何使用promise和vo.js返回Hapi回复

标签 node.js asynchronous promise hapi.js nightmare

我有一个异步的 night.js 进程,它使用 vo.js使用生成器进行流量控制:

vo(function *(url) {
  return yield request.get(url);
})('http://lapwinglabs.com', function(err, res) {
  // ... 
})

这需要使用 reply() 接口(interface)向 Hapi (v.13.0.0) 返回一个 promise 。我看过 Bluebird 和其他 promise 库的示例,例如:How to reply from outside of the hapi.js route handler ,但在适应 vo.js 时遇到困难。有人可以提供一个例子吗?

server.js

server.route({
method: 'GET',
path:'/overview', 
handler: function (request, reply) {
    let crawl = scrape.doCrawl({"user": USERNAME, "pass": PASSWORD});
    reply( ... ).code( 200 );
    }
});

scrape.js

module.exports = {
    DoCrawl: function(credentials) { 
        var Nightmare = require('nightmare');
        var vo = require('vo');

        vo(function *(credentials) {
            var nightmare = Nightmare();
            var result = yield nightmare
               .goto("www.example.com/login")       
               ...
            yield nightmare.end();
            return result

        })(credentials, function(err, res) {
              if (err) return console.log(err);
              return res
        })
    }
};

最佳答案

如果您想将 doCrawl 的结果发送到 hapi 的 reply 方法,则必须将 doCrawl 转换为返回一个 Promise。像这样的东西(未经测试):

server.js

server.route({
method: 'GET',
path:'/overview', 
handler: function (request, reply) {
    let crawl = scrape.doCrawl({"user": USERNAME, "pass": PASSWORD});
    // crawl is a promise
    reply(crawl).code( 200 );
    }
});

scrape.js

module.exports = {
    doCrawl: function(credentials) { 
        var Nightmare = require('nightmare');
        var vo = require('vo');

        return new Promise(function(resolve, reject) {

            vo(function *(credentials) {
                var nightmare = Nightmare();
                var result = yield nightmare
                   .goto("www.example.com/login")       
                   ...
                yield nightmare.end();
                return result

            })(credentials, function(err, res) {
                // reject the promise if there is an error
                if (err) return reject(err);
                // resolve the promise if successful
                resolve(res);
            })
        })
    }
};

关于node.js - 如何使用promise和vo.js返回Hapi回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35335495/

相关文章:

javascript - Node Express 应用程序调用 mssql 表示连接已关闭

node.js - Express JS 反向 URL 路由(Django 风格)

javascript - 将多行从 JSON 结构插入到 MySQL

javascript - 如何在 OpenLayers 5 中删除绘图?

javascript - NodeJS 从哪里开始?

java - 用于创建异步流 API 的框架

perl - 是否可以使用 Perl HTTP::Async 模块读取 header ?

javascript - 相当于 jQuery 的 $.when() 的 Promise 的普通 ES6 等价物是什么?

javascript - Promise.method() 函数没有按照我期望的方式工作

javascript - 如何访问 next .then() 中的日期 - 获取 api