【问题标题】:Handle http responses differently with bluebird Promise使用 bluebird Promise 以不同方式处理 http 响应
【发布时间】:2016-10-31 11:47:17
【问题描述】:

我不熟悉承诺。似乎他们应该让事情变得更容易。但我无法弄清楚这一点。我想处理基于 http 状态码的承诺。即 200 与 301(PS 这是在咖啡脚本中)

所以我使用的是快递,我有一个承诺

express = require 'express'
router = express.Router()
Promise = require 'bluebird'

getRequest = (options) ->
  new Promise (resolve, reject) ->
    responseData = ''
    http.get options, (response) ->
      response.on 'data', (chunk) ->
        responseData += chunk
        response.on 'end', -> resolve responseData

....我想做一些事情,例如(这真的是伪代码)

getRequest
  hostname: 'www.example.com'
  port: 80
  path: 'http://www.example.com' + some_path + '?json=1'
.then (if(response.statusCode is 200)) ->
  response = JSON.parse(response)
  res.render 'express/route',
    data: response
.then (if(response.statusCode is 301)) ->
   getRequest
     hostname: 'www.example.com'
     port: 80
     path: response.headers.location + '?json=1'
 .catch (error) ->
 next(error)

关键是,如果第一个请求返回 301,我想使用该请求的新位置发出另一个请求。但似乎我能传回的只是回应。我必须将 301 视为错误吗?或者有没有办法以不同的方式编写 response.on ?还是 .then() 语句?我真的很茫然。

【问题讨论】:

  • (在最后一个 .then() getRequest 中它会做一些事情)
  • getRequest 在哪里生成带有statusCode 的对象?
  • 在函数内你可以做 response.on 'data', (chunk) -> this.statusCode
  • 那么您可能应该使用resolve {status: @statusCode, data: responseData}then callbac 中访问它们

标签: express coffeescript promise bluebird


【解决方案1】:

我不知道coffeescript,但我会用纯Javascript 向您展示基本思想,您大概可以将其翻译成coffeescript。与其尝试为不同的 response.statusCode 值创建单独的 .then() 处理程序,不如在 .then() 处理程序中使用 if/else 来决定要做什么。

这是基于一个getRequest(),它只接受一个 URL 并返回一个承诺:

function getRequest(url) {
    return new Promise(function(resolve, reject) {
        var req = http.get(url, function(res) {
            var res.data = "";
            res.on('data', function(chunk) {
                res.data += chunk;
            });
            res.on('end', function() {
                resolve(res);
            });
            res.on('error', function(err) {
                reject(err);
            });
        });
        req.on('error', function(err) {
            reject(err);
        });
    });
}        

function get(url, cnt) {
    cnt = cnt || 0;
    return getRequest(url + '?json=1').then(function(response) {
        if (response.statusCode === 200) {
            response = JSON.parse(response.data);
            res.render('express/route', {data: response.data});
        } else if (response.statusCode === 301) {
            if (cnt < 10) {
                // chain next request
                return get(response.headers.location, ++cnt);
            } else {
                // bail with error on likely redirect loop
                return Promise.reject(new Error("Likely redirect loop"));
            }
        } else {
            // decide what to do if some other response.statuscode
        }
    })
 }

 get("http://www.example.com/somepath").then(function(data) {
     // process your data here
 }, next);

【讨论】:

  • @anthonygalligani - 这回答了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 2015-10-23
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多