พังพอน: รับรายชื่อผู้ใช้ทั้งหมด


101

ฉันได้พยายามใช้ 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);
    });
});

โดยพื้นฐานแล้วฉันต้องการให้ดำเนินการเรียกกลับก็ต่อเมื่อผู้ใช้ทั้งหมดถูกดึงข้อมูลจากฐานข้อมูลแล้ว


วิธีเข้าถึงในมุมมอง?
Saani

คำตอบ:


177

ถ้าคุณต้องการคืนค่าการแมปจาก_idถึงไปยังuserคุณสามารถทำได้เสมอ:

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() ส่งคืนเอกสารที่ตรงกันทั้งหมดในอาร์เรย์ดังนั้นโค้ดสุดท้ายของคุณจะส่งอาร์เรย์นั้นไปยังไคลเอนต์


วิธีเข้าถึงในมุมมอง?
Saani

13

หากคุณต้องการส่งข้อมูลไปยังมุมมองให้ส่งข้อมูลต่อไปนี้

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

ภายในมุมมองของคุณคุณสามารถวนรอบข้อมูลโดยใช้ตัวแปรผู้ใช้


9

นี่เป็นเพียงการปรับปรุงคำตอบของ @soulcheck และแก้ไขการพิมพ์ผิดใน forEach (ไม่มีวงเล็บปิด)

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

ไชโย!


วิธีเข้าถึงในมุมมอง?
Saani

1
อธิบาย? เธออยากทำอะไรล่ะ?
Evan P

@Saani เมื่อคุณเข้าถึง/userListเส้นทางคุณจะได้รับวัตถุ JSON ด้วยรูปแบบ:{"123451": {...user 123451}, "123452": {...user 123452} }
Maxwell sc


4

สามารถทำได้ด้วย async await และ 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);

});

1

ในกรณีที่เราต้องการlist all documents in Mongoose collectionหลังจากupdateหรือdelete

เราสามารถแก้ไขฟังก์ชันได้ดังนี้:

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


1

เพื่อสร้างฟังก์ชั่นเพื่อรอการดึงรายการ

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

0

โซลูชันของฉัน

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
        })
    })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.