How do I chain promises and catch in Node.js
I'm trying to insert a new document based on the request received and here's what I'm trying to do.
var function = (req,callBack)=>{
queryDB.findOne({query}).then((result)=>{
return(result); // see if requested object exists in DB and return if yes
}).then((result)=>{
if(condition:if required object exists){
updateDB.updateOne({query}).then((result)=>{ //update required object with new values
if(condition:update successful){
ref.function(value).then((k)=>{ // invoke for computation
return(k);
}).then((k)=>{
var document = new Document({ //create a new document
....
....
....
....
....
});
document.save().then((doc)={
callBack(doc); //return new document after successful insert
}).catch((err)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error while inserting new document
callBack(err);
});
}).catch((error)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
})
}
}).catch((errorMessage)={
callBack(errorMessage);
})
}else{
callBack("Required Object Doesn't Exist");
}
}).catch((errorMessage)=>{
callBack(errorMessage);
})
}
The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.
While the revert back works fine in-case of error in inserting new document to DB.
javascript node.js mongodb mongoose
add a comment |
I'm trying to insert a new document based on the request received and here's what I'm trying to do.
var function = (req,callBack)=>{
queryDB.findOne({query}).then((result)=>{
return(result); // see if requested object exists in DB and return if yes
}).then((result)=>{
if(condition:if required object exists){
updateDB.updateOne({query}).then((result)=>{ //update required object with new values
if(condition:update successful){
ref.function(value).then((k)=>{ // invoke for computation
return(k);
}).then((k)=>{
var document = new Document({ //create a new document
....
....
....
....
....
});
document.save().then((doc)={
callBack(doc); //return new document after successful insert
}).catch((err)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error while inserting new document
callBack(err);
});
}).catch((error)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
})
}
}).catch((errorMessage)={
callBack(errorMessage);
})
}else{
callBack("Required Object Doesn't Exist");
}
}).catch((errorMessage)=>{
callBack(errorMessage);
})
}
The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.
While the revert back works fine in-case of error in inserting new document to DB.
javascript node.js mongodb mongoose
Do not use acallBack
, return a promise instead. Try promise chaining to return a promise for the innermost result.
– Bergi
Nov 13 '18 at 21:26
What exactly isref.function
, and what is the error in it that causes this behaviour?
– Bergi
Nov 13 '18 at 21:40
@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.
– David
Nov 14 '18 at 17:18
What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise.catch()
, you will need atry
block for that.
– Bergi
Nov 14 '18 at 17:34
add a comment |
I'm trying to insert a new document based on the request received and here's what I'm trying to do.
var function = (req,callBack)=>{
queryDB.findOne({query}).then((result)=>{
return(result); // see if requested object exists in DB and return if yes
}).then((result)=>{
if(condition:if required object exists){
updateDB.updateOne({query}).then((result)=>{ //update required object with new values
if(condition:update successful){
ref.function(value).then((k)=>{ // invoke for computation
return(k);
}).then((k)=>{
var document = new Document({ //create a new document
....
....
....
....
....
});
document.save().then((doc)={
callBack(doc); //return new document after successful insert
}).catch((err)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error while inserting new document
callBack(err);
});
}).catch((error)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
})
}
}).catch((errorMessage)={
callBack(errorMessage);
})
}else{
callBack("Required Object Doesn't Exist");
}
}).catch((errorMessage)=>{
callBack(errorMessage);
})
}
The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.
While the revert back works fine in-case of error in inserting new document to DB.
javascript node.js mongodb mongoose
I'm trying to insert a new document based on the request received and here's what I'm trying to do.
var function = (req,callBack)=>{
queryDB.findOne({query}).then((result)=>{
return(result); // see if requested object exists in DB and return if yes
}).then((result)=>{
if(condition:if required object exists){
updateDB.updateOne({query}).then((result)=>{ //update required object with new values
if(condition:update successful){
ref.function(value).then((k)=>{ // invoke for computation
return(k);
}).then((k)=>{
var document = new Document({ //create a new document
....
....
....
....
....
});
document.save().then((doc)={
callBack(doc); //return new document after successful insert
}).catch((err)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error while inserting new document
callBack(err);
});
}).catch((error)=>{
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
})
}
}).catch((errorMessage)={
callBack(errorMessage);
})
}else{
callBack("Required Object Doesn't Exist");
}
}).catch((errorMessage)=>{
callBack(errorMessage);
})
}
The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.
While the revert back works fine in-case of error in inserting new document to DB.
javascript node.js mongodb mongoose
javascript node.js mongodb mongoose
asked Nov 13 '18 at 21:16
DavidDavid
106
106
Do not use acallBack
, return a promise instead. Try promise chaining to return a promise for the innermost result.
– Bergi
Nov 13 '18 at 21:26
What exactly isref.function
, and what is the error in it that causes this behaviour?
– Bergi
Nov 13 '18 at 21:40
@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.
– David
Nov 14 '18 at 17:18
What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise.catch()
, you will need atry
block for that.
– Bergi
Nov 14 '18 at 17:34
add a comment |
Do not use acallBack
, return a promise instead. Try promise chaining to return a promise for the innermost result.
– Bergi
Nov 13 '18 at 21:26
What exactly isref.function
, and what is the error in it that causes this behaviour?
– Bergi
Nov 13 '18 at 21:40
@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.
– David
Nov 14 '18 at 17:18
What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise.catch()
, you will need atry
block for that.
– Bergi
Nov 14 '18 at 17:34
Do not use a
callBack
, return a promise instead. Try promise chaining to return a promise for the innermost result.– Bergi
Nov 13 '18 at 21:26
Do not use a
callBack
, return a promise instead. Try promise chaining to return a promise for the innermost result.– Bergi
Nov 13 '18 at 21:26
What exactly is
ref.function
, and what is the error in it that causes this behaviour?– Bergi
Nov 13 '18 at 21:40
What exactly is
ref.function
, and what is the error in it that causes this behaviour?– Bergi
Nov 13 '18 at 21:40
@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.
– David
Nov 14 '18 at 17:18
@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.
– David
Nov 14 '18 at 17:18
What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise
.catch()
, you will need a try
block for that.– Bergi
Nov 14 '18 at 17:34
What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise
.catch()
, you will need a try
block for that.– Bergi
Nov 14 '18 at 17:34
add a comment |
1 Answer
1
active
oldest
votes
Since ref.function(value)
is followed by a then
with return k
, the catch
block probably only catches the errors if ref.function
rejects the promise and the errors in the block below (after ref.function
)
.then((k)=>{ // invoke for computation
return(k);
})
Try adding Promise.resolve
before the ref.function
return Promise.resolve(
() => {
return ref.function(value);
}).then(
k => {
...
}).catch(
err => {
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
});
Why? Please explain what difference it would make.
– Bergi
Nov 13 '18 at 21:25
@Bergi Since theref.function
is the first call, I think that thecatch
will only catch the errors that happens after that call. With thesuccess, error
, it should catch the error from yourref.function
.
– William Juan
Nov 13 '18 at 21:28
No change still keeps hanging.
– David
Nov 13 '18 at 21:30
@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP
– Bergi
Nov 13 '18 at 21:30
@Bergi My bad, I updated my answer
– William Juan
Nov 13 '18 at 21:35
|
show 1 more comment
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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%2f53289608%2fhow-do-i-chain-promises-and-catch-in-node-js%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Since ref.function(value)
is followed by a then
with return k
, the catch
block probably only catches the errors if ref.function
rejects the promise and the errors in the block below (after ref.function
)
.then((k)=>{ // invoke for computation
return(k);
})
Try adding Promise.resolve
before the ref.function
return Promise.resolve(
() => {
return ref.function(value);
}).then(
k => {
...
}).catch(
err => {
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
});
Why? Please explain what difference it would make.
– Bergi
Nov 13 '18 at 21:25
@Bergi Since theref.function
is the first call, I think that thecatch
will only catch the errors that happens after that call. With thesuccess, error
, it should catch the error from yourref.function
.
– William Juan
Nov 13 '18 at 21:28
No change still keeps hanging.
– David
Nov 13 '18 at 21:30
@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP
– Bergi
Nov 13 '18 at 21:30
@Bergi My bad, I updated my answer
– William Juan
Nov 13 '18 at 21:35
|
show 1 more comment
Since ref.function(value)
is followed by a then
with return k
, the catch
block probably only catches the errors if ref.function
rejects the promise and the errors in the block below (after ref.function
)
.then((k)=>{ // invoke for computation
return(k);
})
Try adding Promise.resolve
before the ref.function
return Promise.resolve(
() => {
return ref.function(value);
}).then(
k => {
...
}).catch(
err => {
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
});
Why? Please explain what difference it would make.
– Bergi
Nov 13 '18 at 21:25
@Bergi Since theref.function
is the first call, I think that thecatch
will only catch the errors that happens after that call. With thesuccess, error
, it should catch the error from yourref.function
.
– William Juan
Nov 13 '18 at 21:28
No change still keeps hanging.
– David
Nov 13 '18 at 21:30
@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP
– Bergi
Nov 13 '18 at 21:30
@Bergi My bad, I updated my answer
– William Juan
Nov 13 '18 at 21:35
|
show 1 more comment
Since ref.function(value)
is followed by a then
with return k
, the catch
block probably only catches the errors if ref.function
rejects the promise and the errors in the block below (after ref.function
)
.then((k)=>{ // invoke for computation
return(k);
})
Try adding Promise.resolve
before the ref.function
return Promise.resolve(
() => {
return ref.function(value);
}).then(
k => {
...
}).catch(
err => {
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
});
Since ref.function(value)
is followed by a then
with return k
, the catch
block probably only catches the errors if ref.function
rejects the promise and the errors in the block below (after ref.function
)
.then((k)=>{ // invoke for computation
return(k);
})
Try adding Promise.resolve
before the ref.function
return Promise.resolve(
() => {
return ref.function(value);
}).then(
k => {
...
}).catch(
err => {
updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
callBack(err);
});
edited Nov 13 '18 at 22:08
answered Nov 13 '18 at 21:21
William JuanWilliam Juan
1294
1294
Why? Please explain what difference it would make.
– Bergi
Nov 13 '18 at 21:25
@Bergi Since theref.function
is the first call, I think that thecatch
will only catch the errors that happens after that call. With thesuccess, error
, it should catch the error from yourref.function
.
– William Juan
Nov 13 '18 at 21:28
No change still keeps hanging.
– David
Nov 13 '18 at 21:30
@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP
– Bergi
Nov 13 '18 at 21:30
@Bergi My bad, I updated my answer
– William Juan
Nov 13 '18 at 21:35
|
show 1 more comment
Why? Please explain what difference it would make.
– Bergi
Nov 13 '18 at 21:25
@Bergi Since theref.function
is the first call, I think that thecatch
will only catch the errors that happens after that call. With thesuccess, error
, it should catch the error from yourref.function
.
– William Juan
Nov 13 '18 at 21:28
No change still keeps hanging.
– David
Nov 13 '18 at 21:30
@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP
– Bergi
Nov 13 '18 at 21:30
@Bergi My bad, I updated my answer
– William Juan
Nov 13 '18 at 21:35
Why? Please explain what difference it would make.
– Bergi
Nov 13 '18 at 21:25
Why? Please explain what difference it would make.
– Bergi
Nov 13 '18 at 21:25
@Bergi Since the
ref.function
is the first call, I think that the catch
will only catch the errors that happens after that call. With the success, error
, it should catch the error from your ref.function
.– William Juan
Nov 13 '18 at 21:28
@Bergi Since the
ref.function
is the first call, I think that the catch
will only catch the errors that happens after that call. With the success, error
, it should catch the error from your ref.function
.– William Juan
Nov 13 '18 at 21:28
No change still keeps hanging.
– David
Nov 13 '18 at 21:30
No change still keeps hanging.
– David
Nov 13 '18 at 21:30
@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP
– Bergi
Nov 13 '18 at 21:30
@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP
– Bergi
Nov 13 '18 at 21:30
@Bergi My bad, I updated my answer
– William Juan
Nov 13 '18 at 21:35
@Bergi My bad, I updated my answer
– William Juan
Nov 13 '18 at 21:35
|
show 1 more comment
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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%2f53289608%2fhow-do-i-chain-promises-and-catch-in-node-js%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
Do not use a
callBack
, return a promise instead. Try promise chaining to return a promise for the innermost result.– Bergi
Nov 13 '18 at 21:26
What exactly is
ref.function
, and what is the error in it that causes this behaviour?– Bergi
Nov 13 '18 at 21:40
@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.
– David
Nov 14 '18 at 17:18
What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise
.catch()
, you will need atry
block for that.– Bergi
Nov 14 '18 at 17:34