Search code examples
javascriptfacebooknode.jsbluebirdfacebook-node-sdk

Bluebird.js in Node and asynchronous api calls


So I'm trying to build my first webapp with Facebook integration (using facebook-node-sdk). I have it making simple calls to the api, but now it's time to put this all in a simple server and make the calls upon request (this isn't going to be the webapp, itself, but more of an API server).

The problem I'm running into is that, even though I've (presumably) used bluebird to Promisify the Facebook sdk and my makeCall method, I'm still getting "hi" printed and then "undefined" - console.log is getting called before makeCall can return anything.

Here's my app.js:

var Promise = require('bluebird')
    , http = require('http')
    , Facebook = Promise.promisifyAll(require('facebook-node-sdk'))
    , config = require('./config')
    , fb = new Facebook({ appId: config.fb.api, secret: config.fb.secret });

var makeCall = new Promise.method(function (username) {
    return fb.api(username, function(err, data) {
        console.log('hi')
        if (err) return err;

        return data;
    });
});

http.createServer( function (req, res) {
    makeCall('/me').then(console.log)
}).listen(8001);

Solution

  • The problem was that I was neither returning a Promise nor was I resolving said un-returned promise. Here's the fixed code (that works!)

    var Promise = require('bluebird')
        , http = require('http')
        , Facebook = Promise.promisifyAll(require('facebook-node-sdk'))
        , config = require('./config')
        , fb = new Facebook({ appId: config.fb.api, secret: config.fb.secret });
    
    var makeCall = new Promise.method(function (username) {
        return new Promise(function (resolve) {
            // resolve
            console.log('resolve')
            fb.api(username, function(err, data) {
                console.log('err: ' + err)
                console.log('data: ' + data)
                if (err) reject(err);
    
                resolve(data);
            });
        });
    });
    
    http.createServer( function (req, res) {
        makeCall('/me').then(function (data) {
            console.log(data)
        })
    }).listen(8001);
    

    Where the output looks like:

    resolve
    err: null
    data: [object Object]
    { id: ... }