Nodejs Promise not resolving/no data returned
up vote
0
down vote
favorite
I have a promise function that makes two request calls and resolves after the second call is done. The second resolve call also depends on the data from the first call. But in the then function, i am getting null for the variable return. Any help would be appreciated.
Edit: secResp.body has the correct data, it is not null
const express = require('express');
const request = require('request');
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name).then(function(participants){
//this is null
console.log(participants);
}).catch(function (err) {
console.log(err);
});
})
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is not null, this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
javascript node.js promise request
|
show 2 more comments
up vote
0
down vote
favorite
I have a promise function that makes two request calls and resolves after the second call is done. The second resolve call also depends on the data from the first call. But in the then function, i am getting null for the variable return. Any help would be appreciated.
Edit: secResp.body has the correct data, it is not null
const express = require('express');
const request = require('request');
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name).then(function(participants){
//this is null
console.log(participants);
}).catch(function (err) {
console.log(err);
});
})
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is not null, this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
javascript node.js promise request
1
Sounds like theparticipants
property of thesecResp.body
isnull
.
– CertainPerformance
Nov 11 at 1:42
add a 'retiurn' ..... return getPlayersInMatch(req.params.name).then ....
– Robert Rowntree
Nov 11 at 1:46
@RobertRowntree - how does that effect the value ofparticipants
result in.then(function(participants)
– Bravo
Nov 11 at 1:51
this is an array
- what is an array?JSON.parse(secResp.body)
? if so, then it's never going to have.participants
property, because arrays do not. While you CAN add any property you like to an array, since the array is "created" by JSON.parse, it's never going to have a custom property
– Bravo
Nov 11 at 1:54
debug step 1 ...console.log(secResp.body)
- add the output to the question
– Bravo
Nov 11 at 1:55
|
show 2 more comments
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have a promise function that makes two request calls and resolves after the second call is done. The second resolve call also depends on the data from the first call. But in the then function, i am getting null for the variable return. Any help would be appreciated.
Edit: secResp.body has the correct data, it is not null
const express = require('express');
const request = require('request');
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name).then(function(participants){
//this is null
console.log(participants);
}).catch(function (err) {
console.log(err);
});
})
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is not null, this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
javascript node.js promise request
I have a promise function that makes two request calls and resolves after the second call is done. The second resolve call also depends on the data from the first call. But in the then function, i am getting null for the variable return. Any help would be appreciated.
Edit: secResp.body has the correct data, it is not null
const express = require('express');
const request = require('request');
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name).then(function(participants){
//this is null
console.log(participants);
}).catch(function (err) {
console.log(err);
});
})
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is not null, this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
javascript node.js promise request
javascript node.js promise request
edited Nov 11 at 1:54
asked Nov 11 at 1:39
dest
205
205
1
Sounds like theparticipants
property of thesecResp.body
isnull
.
– CertainPerformance
Nov 11 at 1:42
add a 'retiurn' ..... return getPlayersInMatch(req.params.name).then ....
– Robert Rowntree
Nov 11 at 1:46
@RobertRowntree - how does that effect the value ofparticipants
result in.then(function(participants)
– Bravo
Nov 11 at 1:51
this is an array
- what is an array?JSON.parse(secResp.body)
? if so, then it's never going to have.participants
property, because arrays do not. While you CAN add any property you like to an array, since the array is "created" by JSON.parse, it's never going to have a custom property
– Bravo
Nov 11 at 1:54
debug step 1 ...console.log(secResp.body)
- add the output to the question
– Bravo
Nov 11 at 1:55
|
show 2 more comments
1
Sounds like theparticipants
property of thesecResp.body
isnull
.
– CertainPerformance
Nov 11 at 1:42
add a 'retiurn' ..... return getPlayersInMatch(req.params.name).then ....
– Robert Rowntree
Nov 11 at 1:46
@RobertRowntree - how does that effect the value ofparticipants
result in.then(function(participants)
– Bravo
Nov 11 at 1:51
this is an array
- what is an array?JSON.parse(secResp.body)
? if so, then it's never going to have.participants
property, because arrays do not. While you CAN add any property you like to an array, since the array is "created" by JSON.parse, it's never going to have a custom property
– Bravo
Nov 11 at 1:54
debug step 1 ...console.log(secResp.body)
- add the output to the question
– Bravo
Nov 11 at 1:55
1
1
Sounds like the
participants
property of the secResp.body
is null
.– CertainPerformance
Nov 11 at 1:42
Sounds like the
participants
property of the secResp.body
is null
.– CertainPerformance
Nov 11 at 1:42
add a 'retiurn' ..... return getPlayersInMatch(req.params.name).then ....
– Robert Rowntree
Nov 11 at 1:46
add a 'retiurn' ..... return getPlayersInMatch(req.params.name).then ....
– Robert Rowntree
Nov 11 at 1:46
@RobertRowntree - how does that effect the value of
participants
result in .then(function(participants)
– Bravo
Nov 11 at 1:51
@RobertRowntree - how does that effect the value of
participants
result in .then(function(participants)
– Bravo
Nov 11 at 1:51
this is an array
- what is an array? JSON.parse(secResp.body)
? if so, then it's never going to have .participants
property, because arrays do not. While you CAN add any property you like to an array, since the array is "created" by JSON.parse, it's never going to have a custom property– Bravo
Nov 11 at 1:54
this is an array
- what is an array? JSON.parse(secResp.body)
? if so, then it's never going to have .participants
property, because arrays do not. While you CAN add any property you like to an array, since the array is "created" by JSON.parse, it's never going to have a custom property– Bravo
Nov 11 at 1:54
debug step 1 ...
console.log(secResp.body)
- add the output to the question– Bravo
Nov 11 at 1:55
debug step 1 ...
console.log(secResp.body)
- add the output to the question– Bravo
Nov 11 at 1:55
|
show 2 more comments
3 Answers
3
active
oldest
votes
up vote
1
down vote
accepted
I rewrote your code for request-promise. The main issue I found with your code is that it's too complicated. Simplifying things makes it easier to find what you did wrong.
const rp = require('request-promise')
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name)
.then(console.log)
.catch(console.error)
})
const getPlayersInMatch = async name => {
const id = await rp(api_url)
.then(res => JSON.parse(res.body).id)
const participants = await rp(api_url2 + 'accountId=' + accountId)
.then(res => JSON.parse(res.body).participants)
return { id, participants }
}
Thanks, i switched to using request promise and it seems to be working.
– dest
Nov 11 at 3:45
add a comment |
up vote
0
down vote
function getPlayersInMatch(name){
return new Promise(async function(resolve, reject){
return await request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
try it.
one, you shoule return request result or object.
two, you should use async await because its not wait to request data in async callback.
you shoule return request result
andyou should use async await
disagree - because you are using it to await a promise inside a promise executor which makes absolutely less sense than the original code - and sincerequest.get
doesn't return a promise, there's absolutely no point toawait
it
– Bravo
Nov 11 at 1:56
Oh you right. Thank you
– 곽대용
Nov 11 at 1:59
add a comment |
up vote
0
down vote
In your code, it's hard to find out which step gets error.
I think it's better to wrap request module like:
/**
* Mapping knowing error_code
* @param {Number} error_code
* @param {String} msg
*/
function error_def(error_code, msg) {
let status, message;
switch(error_code){
case 400:
case 401:
case 402:
case 403:
case 1000:
case 1001:
case 1002:
case 1003:
case 1005:
status = error_code;
message = msg;
break;
default:
status = 2000;
message = 'Undefined Error'
}
return {status: status, msg: message};
}
/**
* Generate error message
* @param {String} tag
* @param {Number} error_code
* @param {String} msg
*/
function gen_error_func(tag = null) {
return function(error_code, msg = null) {
return {tag: tag, error_message: error_def(error_code, msg)}
}
}
/**
* Wrap the request and return interesting keys
* @param {String} tag
* @param {Object} req_opt
* @param {Array} interesting_resp
* @return {Object}
*/
function req_wrap(tag = null, req_opt, interesting_resp = null){
return new Promise((resolve, reject) => {
let gen_error = gen_error_func(tag)
if (!req_opt.url) {
reject(gen_error(1000, 'missing url'));
}
let option = {
url: req_opt.url,
method: (req_opt.method)? req_opt.method: 'GET',
}
request(option, function(error, response, body) {
if(error) {
reject(gen_error(1001, error));
return;
}
if (!response) {
reject(gen_error(1005, 'response is undefine, maybe wrong url!'))
return;
}
if (response.statusCode >= 400) {
//http level error
reject(gen_error(response.statusCode, body));
}else {
let result = {};
let body_json;
try {
body_json = JSON.parse(body);
}catch(e) {
reject(gen_error(1002, `Unknow response: ${body}`))
}
if (interesting_resp) {
interesting_resp.map(key => {
if (body_json[key] == undefined) {
reject(gen_error(1003, `In ${body_json}, undefined ${key}`))
return;
}
result[key] = body_json[key];
})
}else {
result = body_json;
}
resolve(result);
}
})
})
}
- req_wrap:
- Parameters
tag: Showing the request you define, ex: 'first connection'
req_opt: request option
interesting_resp: the keys what you're interesting
- Parameters
NOTE: In req_wrap, if it cannot find the key in interesting_resp in response (undefined or null) the function will reject. It's necessary to check the server's spec you request!
You can rewrite your code:
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
req_wrap('first_conn', {url: api_url}, ['id']).then(result => {
req_wrap('second_conn', {url: api_url2 + 'accountId=' + result.id}, ['participants']).then(result => {
resolve(result.participants)
}).catch(error => {
reject(error)
})
}).catch(error => {
reject(error)
})
});
}
Now it's more clear to check which step is wrong.
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
I rewrote your code for request-promise. The main issue I found with your code is that it's too complicated. Simplifying things makes it easier to find what you did wrong.
const rp = require('request-promise')
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name)
.then(console.log)
.catch(console.error)
})
const getPlayersInMatch = async name => {
const id = await rp(api_url)
.then(res => JSON.parse(res.body).id)
const participants = await rp(api_url2 + 'accountId=' + accountId)
.then(res => JSON.parse(res.body).participants)
return { id, participants }
}
Thanks, i switched to using request promise and it seems to be working.
– dest
Nov 11 at 3:45
add a comment |
up vote
1
down vote
accepted
I rewrote your code for request-promise. The main issue I found with your code is that it's too complicated. Simplifying things makes it easier to find what you did wrong.
const rp = require('request-promise')
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name)
.then(console.log)
.catch(console.error)
})
const getPlayersInMatch = async name => {
const id = await rp(api_url)
.then(res => JSON.parse(res.body).id)
const participants = await rp(api_url2 + 'accountId=' + accountId)
.then(res => JSON.parse(res.body).participants)
return { id, participants }
}
Thanks, i switched to using request promise and it seems to be working.
– dest
Nov 11 at 3:45
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
I rewrote your code for request-promise. The main issue I found with your code is that it's too complicated. Simplifying things makes it easier to find what you did wrong.
const rp = require('request-promise')
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name)
.then(console.log)
.catch(console.error)
})
const getPlayersInMatch = async name => {
const id = await rp(api_url)
.then(res => JSON.parse(res.body).id)
const participants = await rp(api_url2 + 'accountId=' + accountId)
.then(res => JSON.parse(res.body).participants)
return { id, participants }
}
I rewrote your code for request-promise. The main issue I found with your code is that it's too complicated. Simplifying things makes it easier to find what you did wrong.
const rp = require('request-promise')
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.get('/api/currentMatch/:name', function(req, res, next){
getPlayersInMatch(req.params.name)
.then(console.log)
.catch(console.error)
})
const getPlayersInMatch = async name => {
const id = await rp(api_url)
.then(res => JSON.parse(res.body).id)
const participants = await rp(api_url2 + 'accountId=' + accountId)
.then(res => JSON.parse(res.body).participants)
return { id, participants }
}
edited Nov 11 at 2:15
answered Nov 11 at 2:07
Besto
848
848
Thanks, i switched to using request promise and it seems to be working.
– dest
Nov 11 at 3:45
add a comment |
Thanks, i switched to using request promise and it seems to be working.
– dest
Nov 11 at 3:45
Thanks, i switched to using request promise and it seems to be working.
– dest
Nov 11 at 3:45
Thanks, i switched to using request promise and it seems to be working.
– dest
Nov 11 at 3:45
add a comment |
up vote
0
down vote
function getPlayersInMatch(name){
return new Promise(async function(resolve, reject){
return await request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
try it.
one, you shoule return request result or object.
two, you should use async await because its not wait to request data in async callback.
you shoule return request result
andyou should use async await
disagree - because you are using it to await a promise inside a promise executor which makes absolutely less sense than the original code - and sincerequest.get
doesn't return a promise, there's absolutely no point toawait
it
– Bravo
Nov 11 at 1:56
Oh you right. Thank you
– 곽대용
Nov 11 at 1:59
add a comment |
up vote
0
down vote
function getPlayersInMatch(name){
return new Promise(async function(resolve, reject){
return await request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
try it.
one, you shoule return request result or object.
two, you should use async await because its not wait to request data in async callback.
you shoule return request result
andyou should use async await
disagree - because you are using it to await a promise inside a promise executor which makes absolutely less sense than the original code - and sincerequest.get
doesn't return a promise, there's absolutely no point toawait
it
– Bravo
Nov 11 at 1:56
Oh you right. Thank you
– 곽대용
Nov 11 at 1:59
add a comment |
up vote
0
down vote
up vote
0
down vote
function getPlayersInMatch(name){
return new Promise(async function(resolve, reject){
return await request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
try it.
one, you shoule return request result or object.
two, you should use async await because its not wait to request data in async callback.
function getPlayersInMatch(name){
return new Promise(async function(resolve, reject){
return await request.get({
url: api_url
}, function(firstErr, firstResp, body){
if(firstResp.StatusCode != 200){
reject(firstErr);
}
var accountId = JSON.parse(firstResp.body).id;
request.get({
url: api_url2 + 'accountId=' + accountId
}, function(secErr, secResp, body){
if(secResp.StatusCode != 200){
reject(secErr);
}
//this is an array
var participants = JSON.parse(secResp.body).participants;
resolve(participants);
});
});
});
}
try it.
one, you shoule return request result or object.
two, you should use async await because its not wait to request data in async callback.
answered Nov 11 at 1:45
곽대용
455
455
you shoule return request result
andyou should use async await
disagree - because you are using it to await a promise inside a promise executor which makes absolutely less sense than the original code - and sincerequest.get
doesn't return a promise, there's absolutely no point toawait
it
– Bravo
Nov 11 at 1:56
Oh you right. Thank you
– 곽대용
Nov 11 at 1:59
add a comment |
you shoule return request result
andyou should use async await
disagree - because you are using it to await a promise inside a promise executor which makes absolutely less sense than the original code - and sincerequest.get
doesn't return a promise, there's absolutely no point toawait
it
– Bravo
Nov 11 at 1:56
Oh you right. Thank you
– 곽대용
Nov 11 at 1:59
you shoule return request result
and you should use async await
disagree - because you are using it to await a promise inside a promise executor which makes absolutely less sense than the original code - and since request.get
doesn't return a promise, there's absolutely no point to await
it– Bravo
Nov 11 at 1:56
you shoule return request result
and you should use async await
disagree - because you are using it to await a promise inside a promise executor which makes absolutely less sense than the original code - and since request.get
doesn't return a promise, there's absolutely no point to await
it– Bravo
Nov 11 at 1:56
Oh you right. Thank you
– 곽대용
Nov 11 at 1:59
Oh you right. Thank you
– 곽대용
Nov 11 at 1:59
add a comment |
up vote
0
down vote
In your code, it's hard to find out which step gets error.
I think it's better to wrap request module like:
/**
* Mapping knowing error_code
* @param {Number} error_code
* @param {String} msg
*/
function error_def(error_code, msg) {
let status, message;
switch(error_code){
case 400:
case 401:
case 402:
case 403:
case 1000:
case 1001:
case 1002:
case 1003:
case 1005:
status = error_code;
message = msg;
break;
default:
status = 2000;
message = 'Undefined Error'
}
return {status: status, msg: message};
}
/**
* Generate error message
* @param {String} tag
* @param {Number} error_code
* @param {String} msg
*/
function gen_error_func(tag = null) {
return function(error_code, msg = null) {
return {tag: tag, error_message: error_def(error_code, msg)}
}
}
/**
* Wrap the request and return interesting keys
* @param {String} tag
* @param {Object} req_opt
* @param {Array} interesting_resp
* @return {Object}
*/
function req_wrap(tag = null, req_opt, interesting_resp = null){
return new Promise((resolve, reject) => {
let gen_error = gen_error_func(tag)
if (!req_opt.url) {
reject(gen_error(1000, 'missing url'));
}
let option = {
url: req_opt.url,
method: (req_opt.method)? req_opt.method: 'GET',
}
request(option, function(error, response, body) {
if(error) {
reject(gen_error(1001, error));
return;
}
if (!response) {
reject(gen_error(1005, 'response is undefine, maybe wrong url!'))
return;
}
if (response.statusCode >= 400) {
//http level error
reject(gen_error(response.statusCode, body));
}else {
let result = {};
let body_json;
try {
body_json = JSON.parse(body);
}catch(e) {
reject(gen_error(1002, `Unknow response: ${body}`))
}
if (interesting_resp) {
interesting_resp.map(key => {
if (body_json[key] == undefined) {
reject(gen_error(1003, `In ${body_json}, undefined ${key}`))
return;
}
result[key] = body_json[key];
})
}else {
result = body_json;
}
resolve(result);
}
})
})
}
- req_wrap:
- Parameters
tag: Showing the request you define, ex: 'first connection'
req_opt: request option
interesting_resp: the keys what you're interesting
- Parameters
NOTE: In req_wrap, if it cannot find the key in interesting_resp in response (undefined or null) the function will reject. It's necessary to check the server's spec you request!
You can rewrite your code:
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
req_wrap('first_conn', {url: api_url}, ['id']).then(result => {
req_wrap('second_conn', {url: api_url2 + 'accountId=' + result.id}, ['participants']).then(result => {
resolve(result.participants)
}).catch(error => {
reject(error)
})
}).catch(error => {
reject(error)
})
});
}
Now it's more clear to check which step is wrong.
add a comment |
up vote
0
down vote
In your code, it's hard to find out which step gets error.
I think it's better to wrap request module like:
/**
* Mapping knowing error_code
* @param {Number} error_code
* @param {String} msg
*/
function error_def(error_code, msg) {
let status, message;
switch(error_code){
case 400:
case 401:
case 402:
case 403:
case 1000:
case 1001:
case 1002:
case 1003:
case 1005:
status = error_code;
message = msg;
break;
default:
status = 2000;
message = 'Undefined Error'
}
return {status: status, msg: message};
}
/**
* Generate error message
* @param {String} tag
* @param {Number} error_code
* @param {String} msg
*/
function gen_error_func(tag = null) {
return function(error_code, msg = null) {
return {tag: tag, error_message: error_def(error_code, msg)}
}
}
/**
* Wrap the request and return interesting keys
* @param {String} tag
* @param {Object} req_opt
* @param {Array} interesting_resp
* @return {Object}
*/
function req_wrap(tag = null, req_opt, interesting_resp = null){
return new Promise((resolve, reject) => {
let gen_error = gen_error_func(tag)
if (!req_opt.url) {
reject(gen_error(1000, 'missing url'));
}
let option = {
url: req_opt.url,
method: (req_opt.method)? req_opt.method: 'GET',
}
request(option, function(error, response, body) {
if(error) {
reject(gen_error(1001, error));
return;
}
if (!response) {
reject(gen_error(1005, 'response is undefine, maybe wrong url!'))
return;
}
if (response.statusCode >= 400) {
//http level error
reject(gen_error(response.statusCode, body));
}else {
let result = {};
let body_json;
try {
body_json = JSON.parse(body);
}catch(e) {
reject(gen_error(1002, `Unknow response: ${body}`))
}
if (interesting_resp) {
interesting_resp.map(key => {
if (body_json[key] == undefined) {
reject(gen_error(1003, `In ${body_json}, undefined ${key}`))
return;
}
result[key] = body_json[key];
})
}else {
result = body_json;
}
resolve(result);
}
})
})
}
- req_wrap:
- Parameters
tag: Showing the request you define, ex: 'first connection'
req_opt: request option
interesting_resp: the keys what you're interesting
- Parameters
NOTE: In req_wrap, if it cannot find the key in interesting_resp in response (undefined or null) the function will reject. It's necessary to check the server's spec you request!
You can rewrite your code:
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
req_wrap('first_conn', {url: api_url}, ['id']).then(result => {
req_wrap('second_conn', {url: api_url2 + 'accountId=' + result.id}, ['participants']).then(result => {
resolve(result.participants)
}).catch(error => {
reject(error)
})
}).catch(error => {
reject(error)
})
});
}
Now it's more clear to check which step is wrong.
add a comment |
up vote
0
down vote
up vote
0
down vote
In your code, it's hard to find out which step gets error.
I think it's better to wrap request module like:
/**
* Mapping knowing error_code
* @param {Number} error_code
* @param {String} msg
*/
function error_def(error_code, msg) {
let status, message;
switch(error_code){
case 400:
case 401:
case 402:
case 403:
case 1000:
case 1001:
case 1002:
case 1003:
case 1005:
status = error_code;
message = msg;
break;
default:
status = 2000;
message = 'Undefined Error'
}
return {status: status, msg: message};
}
/**
* Generate error message
* @param {String} tag
* @param {Number} error_code
* @param {String} msg
*/
function gen_error_func(tag = null) {
return function(error_code, msg = null) {
return {tag: tag, error_message: error_def(error_code, msg)}
}
}
/**
* Wrap the request and return interesting keys
* @param {String} tag
* @param {Object} req_opt
* @param {Array} interesting_resp
* @return {Object}
*/
function req_wrap(tag = null, req_opt, interesting_resp = null){
return new Promise((resolve, reject) => {
let gen_error = gen_error_func(tag)
if (!req_opt.url) {
reject(gen_error(1000, 'missing url'));
}
let option = {
url: req_opt.url,
method: (req_opt.method)? req_opt.method: 'GET',
}
request(option, function(error, response, body) {
if(error) {
reject(gen_error(1001, error));
return;
}
if (!response) {
reject(gen_error(1005, 'response is undefine, maybe wrong url!'))
return;
}
if (response.statusCode >= 400) {
//http level error
reject(gen_error(response.statusCode, body));
}else {
let result = {};
let body_json;
try {
body_json = JSON.parse(body);
}catch(e) {
reject(gen_error(1002, `Unknow response: ${body}`))
}
if (interesting_resp) {
interesting_resp.map(key => {
if (body_json[key] == undefined) {
reject(gen_error(1003, `In ${body_json}, undefined ${key}`))
return;
}
result[key] = body_json[key];
})
}else {
result = body_json;
}
resolve(result);
}
})
})
}
- req_wrap:
- Parameters
tag: Showing the request you define, ex: 'first connection'
req_opt: request option
interesting_resp: the keys what you're interesting
- Parameters
NOTE: In req_wrap, if it cannot find the key in interesting_resp in response (undefined or null) the function will reject. It's necessary to check the server's spec you request!
You can rewrite your code:
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
req_wrap('first_conn', {url: api_url}, ['id']).then(result => {
req_wrap('second_conn', {url: api_url2 + 'accountId=' + result.id}, ['participants']).then(result => {
resolve(result.participants)
}).catch(error => {
reject(error)
})
}).catch(error => {
reject(error)
})
});
}
Now it's more clear to check which step is wrong.
In your code, it's hard to find out which step gets error.
I think it's better to wrap request module like:
/**
* Mapping knowing error_code
* @param {Number} error_code
* @param {String} msg
*/
function error_def(error_code, msg) {
let status, message;
switch(error_code){
case 400:
case 401:
case 402:
case 403:
case 1000:
case 1001:
case 1002:
case 1003:
case 1005:
status = error_code;
message = msg;
break;
default:
status = 2000;
message = 'Undefined Error'
}
return {status: status, msg: message};
}
/**
* Generate error message
* @param {String} tag
* @param {Number} error_code
* @param {String} msg
*/
function gen_error_func(tag = null) {
return function(error_code, msg = null) {
return {tag: tag, error_message: error_def(error_code, msg)}
}
}
/**
* Wrap the request and return interesting keys
* @param {String} tag
* @param {Object} req_opt
* @param {Array} interesting_resp
* @return {Object}
*/
function req_wrap(tag = null, req_opt, interesting_resp = null){
return new Promise((resolve, reject) => {
let gen_error = gen_error_func(tag)
if (!req_opt.url) {
reject(gen_error(1000, 'missing url'));
}
let option = {
url: req_opt.url,
method: (req_opt.method)? req_opt.method: 'GET',
}
request(option, function(error, response, body) {
if(error) {
reject(gen_error(1001, error));
return;
}
if (!response) {
reject(gen_error(1005, 'response is undefine, maybe wrong url!'))
return;
}
if (response.statusCode >= 400) {
//http level error
reject(gen_error(response.statusCode, body));
}else {
let result = {};
let body_json;
try {
body_json = JSON.parse(body);
}catch(e) {
reject(gen_error(1002, `Unknow response: ${body}`))
}
if (interesting_resp) {
interesting_resp.map(key => {
if (body_json[key] == undefined) {
reject(gen_error(1003, `In ${body_json}, undefined ${key}`))
return;
}
result[key] = body_json[key];
})
}else {
result = body_json;
}
resolve(result);
}
})
})
}
- req_wrap:
- Parameters
tag: Showing the request you define, ex: 'first connection'
req_opt: request option
interesting_resp: the keys what you're interesting
- Parameters
NOTE: In req_wrap, if it cannot find the key in interesting_resp in response (undefined or null) the function will reject. It's necessary to check the server's spec you request!
You can rewrite your code:
function getPlayersInMatch(name){
return new Promise(function(resolve, reject){
req_wrap('first_conn', {url: api_url}, ['id']).then(result => {
req_wrap('second_conn', {url: api_url2 + 'accountId=' + result.id}, ['participants']).then(result => {
resolve(result.participants)
}).catch(error => {
reject(error)
})
}).catch(error => {
reject(error)
})
});
}
Now it's more clear to check which step is wrong.
answered Nov 12 at 16:39
flyfox
12
12
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245123%2fnodejs-promise-not-resolving-no-data-returned%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Sounds like the
participants
property of thesecResp.body
isnull
.– CertainPerformance
Nov 11 at 1:42
add a 'retiurn' ..... return getPlayersInMatch(req.params.name).then ....
– Robert Rowntree
Nov 11 at 1:46
@RobertRowntree - how does that effect the value of
participants
result in.then(function(participants)
– Bravo
Nov 11 at 1:51
this is an array
- what is an array?JSON.parse(secResp.body)
? if so, then it's never going to have.participants
property, because arrays do not. While you CAN add any property you like to an array, since the array is "created" by JSON.parse, it's never going to have a custom property– Bravo
Nov 11 at 1:54
debug step 1 ...
console.log(secResp.body)
- add the output to the question– Bravo
Nov 11 at 1:55