I have tried to use Mongoose to send the list of all users as follows:
server.get('/usersList', function(req, res) {
var users = {};
User.find({}, function (err, user) {
users[user._id] = user;
});
res.send(users);
});
Of course, res.send(users);
is going to send {}
, which is not what I want. Is there a find
alternative with slightly different semantics, where I could do the following?
server.get('/usersList', function(req, res) {
User.find({}, function (err, users) {
res.send(users);
});
});
Essentially, I want the callback to be executed only when all the users have been fetched from the database.
This question is related to
javascript
node.js
mongodb
mongoose
Well, if you really want to return a mapping from _id
to user
, you could always do:
server.get('/usersList', function(req, res) {
User.find({}, function(err, users) {
var userMap = {};
users.forEach(function(user) {
userMap[user._id] = user;
});
res.send(userMap);
});
});
find()
returns all matching documents in an array, so your last code snipped sends that array to the client.
To make function to wait for list to be fetched.
getArrayOfData() {
return DataModel.find({}).then(function (storedDataArray) {
return storedDataArray;
}).catch(function(err){
if (err) {
throw new Error(err.message);
}
});
}
My Solution
User.find()
.exec()
.then(users => {
const response = {
count: users.length,
users: users.map(user => {
return {
_id: user._id,
// other property
}
})
};
res.status(200).json(response);
}).catch(err => {
console.log(err);
res.status(500).json({
success: false
})
})
you can also do it by async function to get all the users
await User.find({},(err,users)=>{
if (err){
return res.status(422).send(err)
}
if (!users){
return res.status(422).send({error:"No data in the collection"})
}
res.send({Allusers:users})
})
There was the very easy way to list your data :
server.get('/userlist' , function (req , res) {
User.find({}).then(function (users) {
res.send(users);
});
});
In case we want to list all documents in Mongoose collection
after update
or delete
We can edit the function to some thing like this:
exports.product_update = function (req, res, next) {
Product.findByIdAndUpdate(req.params.id, {$set: req.body}, function (err, product) {
if (err) return next(err);
Product.find({}).then(function (products) {
res.send(products);
});
//res.send('Product udpated.');
});
};
This will list all documents
on success instead of just showing success message
Same can be done with async await and arrow function
server.get('/usersList', async (req, res) => {
const users = await User.find({});
const userMap = {};
users.forEach((user) => {
userMap[user._id] = user;
});
res.send(userMap);
});
If you'd like to send the data to a view pass the following in.
server.get('/usersList', function(req, res) {
User.find({}, function(err, users) {
res.render('/usersList', {users: users});
});
});
Inside your view you can loop through the data using the variable users
This is just an Improvement of @soulcheck 's answer, and fix of the typo in forEach (missing closing bracket);
server.get('/usersList', (req, res) =>
User.find({}, (err, users) =>
res.send(users.reduce((userMap, item) => {
userMap[item.id] = item
return userMap
}, {}));
);
);
cheers!
Source: Stackoverflow.com