Próbowałem użyć Mongoose, aby wysłać listę wszystkich użytkowników w następujący sposób:
server.get('/usersList', function(req, res) {
var users = {};
User.find({}, function (err, user) {
users[user._id] = user;
});
res.send(users);
});
Oczywiście res.send(users);
wyślę {}
, czego nie chcę. Czy istnieje find
alternatywa z nieco inną semantyką, w której mógłbym wykonać następujące czynności?
server.get('/usersList', function(req, res) {
User.find({}, function (err, users) {
res.send(users);
});
});
Zasadniczo chcę, aby wywołanie zwrotne było wykonywane tylko wtedy, gdy wszyscy użytkownicy zostali pobrani z bazy danych.
javascript
node.js
mongodb
mongoose
Randomblue
źródło
źródło
Odpowiedzi:
Cóż, jeśli naprawdę chcesz zwrócić mapowanie z
_id
douser
, zawsze możesz zrobić: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()
zwraca wszystkie pasujące dokumenty w tablicy, więc ostatni wycięty kod wysyła tę tablicę do klienta.źródło
Jeśli chcesz wysłać dane do widoku, podaj poniższe informacje.
server.get('/usersList', function(req, res) { User.find({}, function(err, users) { res.render('/usersList', {users: users}); }); });
W widoku możesz przeglądać dane za pomocą zmiennych użytkowników
źródło
To jest tylko poprawienie odpowiedzi @soulcheck i poprawienie literówki w forEach (brak nawiasu zamykającego);
server.get('/usersList', (req, res) => User.find({}, (err, users) => res.send(users.reduce((userMap, item) => { userMap[item.id] = item return userMap }, {})); ); );
Twoje zdrowie!
źródło
/userList
trasy, otrzymasz obiekt JSON w formacie:{"123451": {...user 123451}, "123452": {...user 123452} }
Istniał bardzo łatwy sposób, aby wyświetlić swoje dane:
server.get('/userlist' , function (req , res) { User.find({}).then(function (users) { res.send(users); }); });
źródło
To samo można zrobić za pomocą funkcji async await i arrow
server.get('/usersList', async (req, res) => { const users = await User.find({}); const userMap = {}; users.forEach((user) => { userMap[user._id] = user; }); res.send(userMap); });
źródło
Na wypadek, gdybyśmy chcieli
list all documents in Mongoose collection
poupdate
lubdelete
Możemy edytować funkcję na coś takiego:
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.'); }); };
To
list all documents
odniesie sukces zamiast po prostushowing success message
źródło
Aby funkcja oczekiwała na pobranie listy.
getArrayOfData() { return DataModel.find({}).then(function (storedDataArray) { return storedDataArray; }).catch(function(err){ if (err) { throw new Error(err.message); } }); }
źródło
Moje rozwiązanie
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 }) })
źródło