T94j0
T94j0

Reputation: 87

Javascript return is not returning anything

I have a NodeJS server and a helper function that is making a HTTP request, but when I make the call for the function, it comes up as undefined. The call is being made in a callback, so I don't think that there is a problem with the Async part of it.

This is the server.js

console.log(dictionary('wut'));

And this is the function dictionary.

if(dictionary[word]===undefined){
    request({
        url:"https://mashape-community-urban-dictionary.p.mashape.com/define?term="+word,
        headers:{
            'X-Mashape-Key':'KEY HERE',
            'Accept':'text/plain'
        }
    }, function(err, response, body){
            if(!err && response.statusCode==200){
                var info = JSON.parse(body);
                console.log(info.list[0].definition);
                return info.list[0].definition;
            }
    });
} else {
    return dictionary[word];
}

Where word is the word that is being passed to the function.

Edit: I forgot to mention that the dictionary function has

module.exports = function(word){

The return statements are supposed to give the module the value from the callback. Sorry about that, that's kind-of important information.

Upvotes: 1

Views: 1029

Answers (2)

Chris Wright
Chris Wright

Reputation: 773

You're going to want to use a callback method with your helper method.

So your helper defintion would look like this:

function dictionary(word, callback) {
    request({}, function(err, res, body) {
        if (err) {
            return callback(err);
        }

        callback(null, body);
    });
}

And your call would become:

dictionary('wut', function(err, result) {
    if (err) {
        return console.error('Something went wrong!');
    }

    console.log(result);
});

This is obviously a very simple implementation, but the concept is there. Your helpers/ modules/ whatever should be written to accept callback methods that you can then use to bubble up errors and handle them in the appropriate place in your application. This is pretty much the standard way to do things in Node.

Here is how you could call your helper using a simple Express route:

router.route('/:term')
    .get(function(req, res) {
        dictionary(req.params.term, function(err, result) {
            if (err) {
                return res.status(404).send('Something went wrong!');
            }

            res.send(result);
        });
    });

Upvotes: 1

user3117575
user3117575

Reputation:

From my viewpoint, it looks like that request library you're using was designed asynchronous. This means that you should handle the data inside of the callback function.

For instance:

function handle(data) {
  // Handle data
  console.log(data)
}

if(dictionary[word]===undefined){
  request({
    url:"https://mashape-community-urban-dictionary.p.mashape.com/define?term="+word,
    headers:{
        'X-Mashape-Key':'KEY HERE',
        'Accept':'text/plain'
    }
  }, function(err, response, body){
    if(!err && response.statusCode==200){
      var info = JSON.parse(body);
      console.log(info.list[0].definition);
      handle(info.list[0].definition)
    }
  });
} else {
  handle( dictionary[word] )
}

You didn't provide enough information for me to set this up correctly. But hopefully this gives you an idea on what you need to do.


To elaborate on why you should set it up this way:

  1. The request function appears to be asynchronous, so keep it how it was designed.
  2. You're returning inside of the callback, so your outer dictionary function isn't getting that returned data, the callback is.
  3. Since the request function was designed async, there isn't a way to return the data to the dictionary without forcing it to be synchronous (which isn't advised). So you should restructure it to be handled inside of the callback.

(Another little note, you should use typeof dictionary[word] === "undefined", because I believe JavaScript sometimes throws an error otherwise.)

Upvotes: 0

Related Questions