0

I'm new to Node JS. My node js REST api route code is:

'use strict';
module.exports = function(app) {
    var sequel = require('../controllers/sampleController');
    app.get('/task?:email', function(req, res){
        res.send(sequel.listByEmail(req.query.email));
    });
};

And my listByEmail function is:

'use strict';
var apiKey = '1xxxxxxxxL';
exports.listByEmail = function(emailid) {
    console.log(emailid);
    if(emailid != null && emailid != undefined) {
        var xyz = require("xyz-api")(apiKey);
        xyz.person.findByEmail(emailid, function(err, data) {
            if(data.status == 200){
                return data; // data is in json format
            }
        });
    }
};

I returned data like this from that listbyemail function. Data is there, if i try to print the data in console it appears. But while returning the data, it won't returned. It's always return undefined. I can't able to catch the result data from listByEmail function in route and not able to send it as response. Please helpMe!!!

2 Answers 2

2

In your ListByEmail function you are calling an asynchronous method, findByEmail.

When you reach the return data; line, your listByEmail function already returned so you are not returning anything to the caller.

You need to handle it asynchronously, for example:

'use strict';
var apiKey = '1xxxxxxxxL';
exports.listByEmail = function(emailid) {
    return new Promise(function(resolve, reject) {
        console.log(emailid);
        if(emailid != null && emailid != undefined) {
            var xyz = require("xyz-api")(apiKey);
            xyz.person.findByEmail(emailid, function(err, data) {
                if(data.status == 200){
                    resolve(data); // data is in json format
                }
            });
        } else {
            reject("Invalid input");
        }
    };

Then:

'use strict';
module.exports = function(app) {
    var sequel = require('../controllers/sampleController');
    app.get('/task?:email', function(req, res){
        sequel.listByEmail(req.query.email).then(function(data) {
            res.send(data);
        });
    });
};

This is a very basic example of using Promise to handle asynchronous calls in node. You should study a little bit how this works. You can start for example by reading this: https://www.promisejs.org/

Sign up to request clarification or add additional context in comments.

Comments

0

UPD Once you understand how to deal with callbacks, you'd better to look towards Promises, async/await, and async.js

Your function #findByEmail is asynchronous, so possibly your route should look like

'use strict';
module.exports = function(app) {
    var sequel = require('../controllers/sampleController');
    app.get('/task?:email', function(req, res){
        sequel.listByEmail(req.query.email, function(err, list){
          if(err){
            console.error(err);
            //handle error
          }
          res.send(list);
        })
    });
};

and your #listByEmail function should be like

'use strict';
var apiKey = '1xxxxxxxxL';
exports.listByEmail = function(emailid, callback) {
    console.log(emailid);
    if(emailid != null && emailid != undefined) {
        var xyz = require("xyz-api")(apiKey);
        xyz.person.findByEmail(emailid, function(err, data) {
            if(err){
              callback(err);
            } else if(data.status == 200){
                callback(null, data);
            }
        });
    }
};

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.