Projektuję funkcję synchronizacji klient/serwer. Klient wysyła kilka zmienionych zdarzeń do serwera. Serwer wykona, skasuje lub zmieni stan na żądany status produktu. Po operacji bazy danych serwer musi wysłać podsumowanie klientowi.Jak wykonać synchroniczne wywołanie z mangusta i nodejs
Poniżej znajduje się fragment kodu mojego serwera, zaprojektowany z mangustą i restify.
var EventModel = mongoose.model('Event', eventSchema);
server.post("/sync", function (req, res, next) {
var events = req.params.events;
var created = [], deleted = [], updated = [];
events.forEach(function (elem) {
if (elem.status == 0) {
// Delete
EventModel.remove({ _id: elem.uuid }, function (err, event) {
if (!err) deleted.push({uuid: elem.uuid});
});
} else if (elem.status == 1) {
// Create and update uuid
var event = new EventModel(elem);
event.save(function (err, doc) {
if (!err) {
elem.uuid = event._doc._id;
created.push(elem);
}
});
} else if (elem.status == 2) {
// Update
EventModel.findOne({ _id: elem.uuid }, function (err, event) {
event.save(function (err, doc) {
if (!err) updated.push({uuid:elem.uuid});
});
});
}
});
// Notify client what are processed.
// PROBLEM: created, deleted, updated are always empty!
res.send({processed: {created: created, deleted: deleted, updated: updated}});
});
Od mangusta zrobić CRUD w sposób asynchroniczny, odpowiedź created
, deleted
i updated
są zawsze puste. Czy jest jakiś sposób, aby pozwolić operacji mongoose w serii?
Musisz nauczyć się pisać asynchroniczny kod. W szczególności spójrz na 'async.forEach', który obsłuży wywołania zwrotne i pozwoli ci uruchomić po zakończeniu wszystkiego. – SLaks
Sprawdź ten link - http://stackoverflow.com/questions/17181248/making-mongoose-js-queries-run-synchronously/17296329#17296329 –
jeszcze jeden - http://stackoverflow.com/questions/24185367/mongoose- find-data-by-looping-on-tablica-of-models/24190334 # 24190334 –