node.js + request => node.js + bluebird + request

I’m trying to understand how to write code with promises.
Check my code plz. This is right?

Node.js + request:

  • How do I get rid of a Bluebird warning when chaining more than one flatMap operator in RxJS?
  • Promises and irregular callbacks
  • Promisifying bcrypt-nodejs with Bluebird
  • Bluebird promises - nesting vs rejecting pattern
  • Use ldapjs with bluebird promise
  • How do I access 'this' inside of Promise.map?
  • request(url, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var jsonpData = body;
            var json;
            try {
                json = JSON.parse(jsonpData);
            } catch (e) {
                var startPos = jsonpData.indexOf('({');
                var endPos = jsonpData.indexOf('})');
                var jsonString = jsonpData.substring(startPos+1, endPos+1);
                json = JSON.parse(jsonString);
            }
            callback(null, json);
        } else {
            callback(error);
        }
    });
    

    Node.js + bluebird + request:

    request.getAsync(url)
       .spread(function(response, body) {return body;})
       .then(JSON.parse)
       .then(function(json){console.log(json)})
       .catch(function(e){console.error(e)});
    

    How to check response status? I should use if from first example or something more interesting?

  • How to Promisify node.js net.connect (with bluebird)?
  • Bluebird promise resolve(data) is undefined in client code
  • Bluebird promisify multiple arguments
  • Promises and generic .catch() statements
  • Validate.js promises on custom validation
  • Promise findOneAsync variable = {“isFulfilled”:false,“isRejected”:false}?
  • 2 Solutions collect form web for “node.js + request => node.js + bluebird + request”

    You can simply check if the response.statusCode is not 200 in the spread handler and throw an Error from that, so that the catch handler will take care of it. You can implement it like this

    var request = require('bluebird').promisifyAll(require('request'), {multiArgs: true});
    
    request.getAsync(url).spread(function (response, body) {
        if (response.statusCode != 200)
            throw new Error('Unsuccessful attempt. Code: ' + response.statusCode);
        return JSON.parse(body);
    }).then(console.log).catch(console.error);
    

    And if you notice, we return the parsed JSON from the spread handler, because JSON.parse is not an async function, so we don’t have to do it in a separate then handler.

    One way to check the status code:

    .spread(function(response, body) {
      if (response.statusCode !== 200) {
        throw new Error('Unexpected status code');
      }
      return body;
    })