【问题标题】:Mongoose: Get full list of usersMongoose:获取完整的用户列表
【发布时间】:2012-12-15 17:34:04
【问题描述】:

我曾尝试使用 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);
    });
});

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

【问题讨论】:

  • 如何在视图中访问?

标签: javascript node.js mongodb mongoose


【解决方案1】:

好吧,如果你真的想返回从 _iduser 的映射,你总是可以这样做:

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() 在一个数组中返回所有匹配的文档,因此您最后截取的代码将该数组发送到客户端。

【讨论】:

  • 如何在视图中访问?
【解决方案2】:

如果您想将数据发送到视图,请传入以下内容。

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

在您的视图中,您可以使用变量 users 遍历数据

【讨论】:

    【解决方案3】:

    有一种非常简单的方法来列出您的数据:

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

    【讨论】:

      【解决方案4】:

      这只是对@soulcheck 答案的改进,并修复了 forEach 中的错字(缺少右括号);

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

      干杯!

      【讨论】:

      • 如何在视图中访问?
      • 解释一下?你想做什么?
      • @Saani 当您访问 /userList 路由时,您将收到一个 JSON 对象,其格式为:{"123451": {...user 123451}, "123452": {...user 123452} }
      【解决方案5】:

      异步等待和箭头函数也可以做到这一点

      server.get('/usersList', async (req, res) => {
      
      const users = await User.find({});
      
      const userMap = {};
      users.forEach((user) => {
          userMap[user._id] = user;
      });
      
      res.send(userMap);
      
      });
      

      【讨论】:

        【解决方案6】:

        如果我们想在updatedelete 之后使用list all documents in Mongoose collection

        我们可以将函数编辑成这样:

        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

        【讨论】:

          【解决方案7】:

          使函数等待获取列表。

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

          【讨论】:

            【解决方案8】:

            我的解决方案

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

            【讨论】:

              【解决方案9】:

              你可以试试这个-

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

              【讨论】:

                【解决方案10】:

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

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

                【讨论】:

                  猜你喜欢
                  • 2018-03-13
                  • 1970-01-01
                  • 2011-10-27
                  • 2018-11-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-11-09
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多