Per mantenere l'architettura pulita del mio microservice node.js, ho controller, servizi e ad es. repository.
Voglio un flusso di dati sincrono: controller - > servizio - > repository - > servizio - > controller. In questo flusso (in una semplice user story) il repository restituisce i dati al servizio e al servizio sul controller. Ma il repository dovrebbe elaborare le richieste allo storage esterno in modo asincrono. Tutto il codice asincrono dovrebbe esistere solo nel repository, il servizio dovrebbe ottenere dati non elaborati.
La mia attuale implementazione:
UserController.js
module.exports.create = function() {
console.log("In controller: before service call");
let userDto = JSON.parse(this.request.body);
let savedUser = userService.createUser(userDto);
console.log("In controller: after service call");
};
UserService.js
module.exports.createUser = function createUser(userDto) {
let user = require('../domain/user/User');
user.login = userDto.login;
user.password = userDto.password;
let userRepository = require('../infrastructure/user/UserRepository');
Q.spawn(function* () {
console.log("In service before promise resolve");
let savedUser = yield userRepository.createUser(user);
console.log("In service after promise resolve");
return savedUser;
});
console.log("In service: after repository call");
};
UserRepository.js
module.exports.createUser = function createUser(user) {
console.log("In repository: before save call");
return new Q.Promise(function(resolve, reject) {
userEntity.save(function(err, savedUser) {
console.log("In repository: inside callback after save call");
if (err) {
console.log("In repository: inside callback before reject");
reject(Error('Błąd zapisu danych!'));
} else {
console.log("In repository: inside callback before resolve");
resolve(savedUser);
}
});
});
};
Registri:
- Nel controller: prima della chiamata di servizio
- In servizio prima della risoluzione della promessa
- Nel repository: prima di salvare la chiamata
- In servizio: dopo la chiamata al repository
- Nel controller: dopo la chiamata di servizio
- Nel repository: callback interno dopo la chiamata di salvataggio
- Nel repository: callback interno prima di risolvere
- In servizio dopo la risoluzione della promessa
Vorrei ottenere la seguente sequenza di log:
- Nel controller: prima della chiamata di servizio
- In servizio prima della risoluzione della promessa
- Nel repository: prima di salvare la chiamata
- Nel repository: callback interno dopo la chiamata di salvataggio
- Nel repository: callback interno prima di risolvere
- In servizio dopo la risoluzione della promessa
- Nel controller: dopo la chiamata di servizio