Mungo: Vollständige Liste der Benutzer abrufen


95

Ich habe versucht, mit Mongoose die Liste aller Benutzer wie folgt zu senden:

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

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

    res.send(users);
});

Natürlich res.send(users);wird senden {}, was ich nicht will. Gibt es eine findAlternative mit etwas anderer Semantik, bei der ich Folgendes tun könnte?

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

Im Wesentlichen möchte ich, dass der Rückruf nur ausgeführt wird, wenn alle Benutzer aus der Datenbank abgerufen wurden.


Wie kann ich in der Ansicht darauf zugreifen?
Saani

Antworten:


169

Wenn Sie wirklich ein Mapping von _idbis zurückgeben möchten user, können Sie immer Folgendes tun:

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() Gibt alle übereinstimmenden Dokumente in einem Array zurück, sodass Ihr zuletzt abgeschnittener Code dieses Array an den Client sendet.


Wie kann ich in der Ansicht darauf zugreifen?
Saani

12

Wenn Sie die Daten an eine Ansicht senden möchten, geben Sie Folgendes ein.

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

In Ihrer Ansicht können Sie die Daten mithilfe der variablen Benutzer durchlaufen


9

Dies ist nur eine Verbesserung der Antwort von @soulcheck und eine Korrektur des Tippfehlers in forEach (fehlende schließende Klammer).

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

Prost!


Wie kann ich in der Ansicht darauf zugreifen?
Saani

1
erklären? Was möchten Sie tun?
Evan P

@ Saani Wenn Sie auf die /userListRoute zugreifen , erhalten Sie ein JSON-Objekt mit dem Format:{"123451": {...user 123451}, "123452": {...user 123452} }
Maxwell sc

8

Es gab eine sehr einfache Möglichkeit, Ihre Daten aufzulisten:

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

3

Gleiches kann mit asynchroner Warte- und Pfeilfunktion erfolgen

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

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

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

res.send(userMap);

});

1

Für den Fall, dass wir list all documents in Mongoose collectionnach updateoder wollendelete

Wir können die Funktion folgendermaßen bearbeiten:

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

Dies wird list all documentsauf Erfolg statt nurshowing success message


1

Damit die Funktion darauf wartet, dass die Liste abgerufen wird.

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

0

Meine Lösung

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
        })
    })
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.