Mongoose: получить полный список пользователей


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

Внутри вашего представления вы можете перебирать данные, используя переменную 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

8

Это был очень простой способ перечислить ваши данные:

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

4

То же самое можно сделать с помощью async await и стрелочной функции

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
        })
    })
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.