using async/await in mongoose schema subdocument [duplicate]
This question already has an answer here:
why mongoose queries dos not work when put inside promise function
1 answer
I have been trying to get an ID from TransactionType Schema and use it as a reference in the new Category but it always calls to create the new category before it finishes the query of new TransactionType.
const Category = require("../models/categories.model");
const TransactionType = require("../models/transactiontype.model");
async function saveNewCategory(req, res, next) {
let transactionID;
const transID = await TransactionType.findOne({ name: req.body.transactionType })
.populate("transactionType")
.exec((error, res) => {
console.log(res.id);
transactionID = res.id;
console.log(transactionID);
return transactionID;
});
const newCategory = await new Category({
name: req.body.name,
transactionType: transactionID || transID ,
image: req.body.image,
description: req.body.description
});
try {
await newCategory.save();
await res
.status(200)
.send({ response: "Response " + JSON.stringify(req.body, undefined, 2) });
} catch (error) {
console.log(error);
}
};
module.exports = {
saveNewCategory
};
It creates newCategory with transactionType undefined before it finishes transID.
Please find below the Schema for Category.
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const category = new Schema({
name: String,
transactionType : {
type: Schema.Types.ObjectId,
ref: "TransactionType"
},
image: String,
description: String
});
const Category = mongoose.model('Category', category);
module.exports = Category;
Find below the TransactionType model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const transactionType = new Schema({
transaction: String
});
const TransactionType = mongoose.model('TransactionType', transactionType);
module.exports = TransactionType;
I will be grateful if anyone could assist me with understanding this. I have gone through many books and blogs to understand async await but still no answer.
javascript node.js mongoose schema
marked as duplicate by Neil Lunn
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 23 '18 at 8:06
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
why mongoose queries dos not work when put inside promise function
1 answer
I have been trying to get an ID from TransactionType Schema and use it as a reference in the new Category but it always calls to create the new category before it finishes the query of new TransactionType.
const Category = require("../models/categories.model");
const TransactionType = require("../models/transactiontype.model");
async function saveNewCategory(req, res, next) {
let transactionID;
const transID = await TransactionType.findOne({ name: req.body.transactionType })
.populate("transactionType")
.exec((error, res) => {
console.log(res.id);
transactionID = res.id;
console.log(transactionID);
return transactionID;
});
const newCategory = await new Category({
name: req.body.name,
transactionType: transactionID || transID ,
image: req.body.image,
description: req.body.description
});
try {
await newCategory.save();
await res
.status(200)
.send({ response: "Response " + JSON.stringify(req.body, undefined, 2) });
} catch (error) {
console.log(error);
}
};
module.exports = {
saveNewCategory
};
It creates newCategory with transactionType undefined before it finishes transID.
Please find below the Schema for Category.
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const category = new Schema({
name: String,
transactionType : {
type: Schema.Types.ObjectId,
ref: "TransactionType"
},
image: String,
description: String
});
const Category = mongoose.model('Category', category);
module.exports = Category;
Find below the TransactionType model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const transactionType = new Schema({
transaction: String
});
const TransactionType = mongoose.model('TransactionType', transactionType);
module.exports = TransactionType;
I will be grateful if anyone could assist me with understanding this. I have gone through many books and blogs to understand async await but still no answer.
javascript node.js mongoose schema
marked as duplicate by Neil Lunn
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 23 '18 at 8:06
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
const transID = await TransactionType.findOne({ name: req.body.transactionType }) .populate("transactionType")
That's already a promise and you don't need theexec()
and callback. Also really would be best to be inside the try. And thenew Category()
is not actually async, so you don't need toawait
it. Make the change to the first method, remove the await on thenew Category()
and then move all that code inside thetry
block at the top of it. Job done.
– Neil Lunn
Nov 23 '18 at 8:01
Wow.. It hit the nail right on the head... Thank you @NeilLunn... Perfect job...
– Andrew Ogaga
Nov 23 '18 at 8:38
add a comment |
This question already has an answer here:
why mongoose queries dos not work when put inside promise function
1 answer
I have been trying to get an ID from TransactionType Schema and use it as a reference in the new Category but it always calls to create the new category before it finishes the query of new TransactionType.
const Category = require("../models/categories.model");
const TransactionType = require("../models/transactiontype.model");
async function saveNewCategory(req, res, next) {
let transactionID;
const transID = await TransactionType.findOne({ name: req.body.transactionType })
.populate("transactionType")
.exec((error, res) => {
console.log(res.id);
transactionID = res.id;
console.log(transactionID);
return transactionID;
});
const newCategory = await new Category({
name: req.body.name,
transactionType: transactionID || transID ,
image: req.body.image,
description: req.body.description
});
try {
await newCategory.save();
await res
.status(200)
.send({ response: "Response " + JSON.stringify(req.body, undefined, 2) });
} catch (error) {
console.log(error);
}
};
module.exports = {
saveNewCategory
};
It creates newCategory with transactionType undefined before it finishes transID.
Please find below the Schema for Category.
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const category = new Schema({
name: String,
transactionType : {
type: Schema.Types.ObjectId,
ref: "TransactionType"
},
image: String,
description: String
});
const Category = mongoose.model('Category', category);
module.exports = Category;
Find below the TransactionType model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const transactionType = new Schema({
transaction: String
});
const TransactionType = mongoose.model('TransactionType', transactionType);
module.exports = TransactionType;
I will be grateful if anyone could assist me with understanding this. I have gone through many books and blogs to understand async await but still no answer.
javascript node.js mongoose schema
This question already has an answer here:
why mongoose queries dos not work when put inside promise function
1 answer
I have been trying to get an ID from TransactionType Schema and use it as a reference in the new Category but it always calls to create the new category before it finishes the query of new TransactionType.
const Category = require("../models/categories.model");
const TransactionType = require("../models/transactiontype.model");
async function saveNewCategory(req, res, next) {
let transactionID;
const transID = await TransactionType.findOne({ name: req.body.transactionType })
.populate("transactionType")
.exec((error, res) => {
console.log(res.id);
transactionID = res.id;
console.log(transactionID);
return transactionID;
});
const newCategory = await new Category({
name: req.body.name,
transactionType: transactionID || transID ,
image: req.body.image,
description: req.body.description
});
try {
await newCategory.save();
await res
.status(200)
.send({ response: "Response " + JSON.stringify(req.body, undefined, 2) });
} catch (error) {
console.log(error);
}
};
module.exports = {
saveNewCategory
};
It creates newCategory with transactionType undefined before it finishes transID.
Please find below the Schema for Category.
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const category = new Schema({
name: String,
transactionType : {
type: Schema.Types.ObjectId,
ref: "TransactionType"
},
image: String,
description: String
});
const Category = mongoose.model('Category', category);
module.exports = Category;
Find below the TransactionType model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const transactionType = new Schema({
transaction: String
});
const TransactionType = mongoose.model('TransactionType', transactionType);
module.exports = TransactionType;
I will be grateful if anyone could assist me with understanding this. I have gone through many books and blogs to understand async await but still no answer.
This question already has an answer here:
why mongoose queries dos not work when put inside promise function
1 answer
javascript node.js mongoose schema
javascript node.js mongoose schema
asked Nov 23 '18 at 7:40
Andrew OgagaAndrew Ogaga
62
62
marked as duplicate by Neil Lunn
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 23 '18 at 8:06
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Neil Lunn
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 23 '18 at 8:06
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
const transID = await TransactionType.findOne({ name: req.body.transactionType }) .populate("transactionType")
That's already a promise and you don't need theexec()
and callback. Also really would be best to be inside the try. And thenew Category()
is not actually async, so you don't need toawait
it. Make the change to the first method, remove the await on thenew Category()
and then move all that code inside thetry
block at the top of it. Job done.
– Neil Lunn
Nov 23 '18 at 8:01
Wow.. It hit the nail right on the head... Thank you @NeilLunn... Perfect job...
– Andrew Ogaga
Nov 23 '18 at 8:38
add a comment |
const transID = await TransactionType.findOne({ name: req.body.transactionType }) .populate("transactionType")
That's already a promise and you don't need theexec()
and callback. Also really would be best to be inside the try. And thenew Category()
is not actually async, so you don't need toawait
it. Make the change to the first method, remove the await on thenew Category()
and then move all that code inside thetry
block at the top of it. Job done.
– Neil Lunn
Nov 23 '18 at 8:01
Wow.. It hit the nail right on the head... Thank you @NeilLunn... Perfect job...
– Andrew Ogaga
Nov 23 '18 at 8:38
const transID = await TransactionType.findOne({ name: req.body.transactionType }) .populate("transactionType")
That's already a promise and you don't need the exec()
and callback. Also really would be best to be inside the try. And the new Category()
is not actually async, so you don't need to await
it. Make the change to the first method, remove the await on the new Category()
and then move all that code inside the try
block at the top of it. Job done.– Neil Lunn
Nov 23 '18 at 8:01
const transID = await TransactionType.findOne({ name: req.body.transactionType }) .populate("transactionType")
That's already a promise and you don't need the exec()
and callback. Also really would be best to be inside the try. And the new Category()
is not actually async, so you don't need to await
it. Make the change to the first method, remove the await on the new Category()
and then move all that code inside the try
block at the top of it. Job done.– Neil Lunn
Nov 23 '18 at 8:01
Wow.. It hit the nail right on the head... Thank you @NeilLunn... Perfect job...
– Andrew Ogaga
Nov 23 '18 at 8:38
Wow.. It hit the nail right on the head... Thank you @NeilLunn... Perfect job...
– Andrew Ogaga
Nov 23 '18 at 8:38
add a comment |
1 Answer
1
active
oldest
votes
I think you can put everything whats async in an immediate async function. This way the saveNewCategory
won`t end before your async opereations finish.
async function saveNewCategory(req, res, next) {
(async () => {
await asyncStuff()
})()
}
Edit: to understand better async await and promises check this article out:
https://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I think you can put everything whats async in an immediate async function. This way the saveNewCategory
won`t end before your async opereations finish.
async function saveNewCategory(req, res, next) {
(async () => {
await asyncStuff()
})()
}
Edit: to understand better async await and promises check this article out:
https://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html
add a comment |
I think you can put everything whats async in an immediate async function. This way the saveNewCategory
won`t end before your async opereations finish.
async function saveNewCategory(req, res, next) {
(async () => {
await asyncStuff()
})()
}
Edit: to understand better async await and promises check this article out:
https://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html
add a comment |
I think you can put everything whats async in an immediate async function. This way the saveNewCategory
won`t end before your async opereations finish.
async function saveNewCategory(req, res, next) {
(async () => {
await asyncStuff()
})()
}
Edit: to understand better async await and promises check this article out:
https://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html
I think you can put everything whats async in an immediate async function. This way the saveNewCategory
won`t end before your async opereations finish.
async function saveNewCategory(req, res, next) {
(async () => {
await asyncStuff()
})()
}
Edit: to understand better async await and promises check this article out:
https://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html
answered Nov 23 '18 at 7:44
Bogdan M.Bogdan M.
1,25052247
1,25052247
add a comment |
add a comment |
const transID = await TransactionType.findOne({ name: req.body.transactionType }) .populate("transactionType")
That's already a promise and you don't need theexec()
and callback. Also really would be best to be inside the try. And thenew Category()
is not actually async, so you don't need toawait
it. Make the change to the first method, remove the await on thenew Category()
and then move all that code inside thetry
block at the top of it. Job done.– Neil Lunn
Nov 23 '18 at 8:01
Wow.. It hit the nail right on the head... Thank you @NeilLunn... Perfect job...
– Andrew Ogaga
Nov 23 '18 at 8:38