Mongoose: Nhận danh sách người dùng đầy đủ


99

Tôi đã thử sử dụng Mongoose để gửi danh sách tất cả người dùng như sau:

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

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

    res.send(users);
});

Tất nhiên, res.send(users);sẽ gửi {}, đó không phải là những gì tôi muốn. Có một findcách thay thế với ngữ nghĩa hơi khác, nơi tôi có thể làm như sau?

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

Về cơ bản, tôi muốn lệnh gọi lại chỉ được thực thi khi tất cả người dùng đã được tìm nạp từ cơ sở dữ liệu.


làm thế nào để truy cập nó trong chế độ xem?
Saani

Câu trả lời:


173

Chà, nếu bạn thực sự muốn trả về một ánh xạ từ _idtới user, bạn luôn có thể làm:

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() trả về tất cả các tài liệu phù hợp trong một mảng, vì vậy mã cuối cùng của bạn được cắt sẽ gửi mảng đó đến máy khách.


làm thế nào để truy cập nó trong chế độ xem?
Saani

13

Nếu bạn muốn gửi dữ liệu đến một chế độ xem, hãy chuyển phần sau vào.

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

Bên trong chế độ xem của bạn, bạn có thể lặp lại dữ liệu bằng cách sử dụng biến người dùng


9

Đây chỉ là một Cải tiến cho câu trả lời của @soulcheck và sửa lỗi đánh máy trong forEach (thiếu dấu ngoặc đóng);

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

chúc mừng!


làm thế nào để truy cập nó trong chế độ xem?
Saani

1
giải thích? Bạn muốn làm gì?
Evan P

@Saani khi bạn truy cập vào /userListtuyến đường, bạn sẽ nhận được một đối tượng JSON với định dạng:{"123451": {...user 123451}, "123452": {...user 123452} }
Maxwell sc

8

Có một cách rất dễ dàng để liệt kê dữ liệu của bạn:

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

3

Tương tự có thể được thực hiện với chức năng chờ đợi và mũi tên không đồng bộ

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

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

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

res.send(userMap);

});

1

Trong trường hợp chúng tôi muốn list all documents in Mongoose collectionsau updatehoặcdelete

Chúng ta có thể chỉnh sửa hàm thành một số thứ như sau:

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

Điều này sẽ list all documentsthành công thay vì chỉshowing success message


1

Để thực hiện chức năng đợi danh sách được tìm nạp.

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

0

Giải pháp của tôi

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
        })
    })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.