Reputation: 39
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!!!
Upvotes: 0
Views: 19629
Reputation: 2346
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);
}
});
}
};
Upvotes: 0
Reputation: 13260
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/
Upvotes: 2