猫鼬: 获取完整的用户列表

我尝试使用 Mongoose 发送所有用户的列表如下:

server.get('/usersList', function(req, res) {
var users = {};


User.find({}, function (err, user) {
users[user._id] = user;
});


res.send(users);
});

当然,res.send(users);会发送 {},这不是我想要的。有没有一种语义稍有不同的 find替代品,我可以在哪里执行以下操作?

server.get('/usersList', function(req, res) {
User.find({}, function (err, users) {
res.send(users);
});
});

本质上,我希望只有当所有用户都已从数据库中获取时才执行回调。

269888 次浏览

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()返回一个数组中的所有匹配文档,因此上次剪切的代码将该数组发送给客户端。

这只是@soulcheck 的答案的一个改进,并修复了 forEach 中的输入错误(缺少结束括号) ;

    server.get('/usersList', (req, res) =>
User.find({}, (err, users) =>
res.send(users.reduce((userMap, item) => {
userMap[item.id] = item
return 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});
});
});

在视图内部,可以使用变量 users 循环访问数据

有一种非常简单的方法可以列出你的数据:

server.get('/userlist' , function (req , res) {
User.find({}).then(function (users) {
res.send(users);
});
});

如果我们想 list all documents in Mongoose collectionupdatedelete

我们可以像这样编辑函数:

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.');
});
};

这将 list all documents的成功,而不仅仅是 showing success message

对于异步等待和箭头函数也可以这样做

server.get('/usersList', async (req, res) => {


const users = await User.find({});


const userMap = {};
users.forEach((user) => {
userMap[user._id] = user;
});


res.send(userMap);


});

使函数等待获取列表。

getArrayOfData() {
return DataModel.find({}).then(function (storedDataArray) {
return storedDataArray;
}).catch(function(err){
if (err) {
throw new Error(err.message);
}
});
}

我的解决方案

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
})
})

您也可以通过异步函数来获取所有用户

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})


})

你可以试试这个

User.find().exec(function(err, users){
console.log('users : ', users);
console.log('err', err);
return res.send(users);
});

只有在执行查询之后才执行回调方法。

app.get('/api/users', (req,res) => {
User.find({}, (err, users) => err ? console.log(err) : res.json(users));
});