In order to keep clean architecture of my node.js microservice I have controllers, services and e.g. repositories.
I want a synchronous data flow: controller -> service -> repository -> service -> controller. In this flow (in simple user story) repository returns data to service and service to controller. But repository should process requests to external storage in a asynchronous way. All asynchronous code should exist only in repository, service should obtain raw data.
My current implementation:
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);
}
});
});
};
Logs:
- In controller: before service call
- In service before promise resolve
- In repository: before save call
- In service: after repository call
- In controller: after service call
- In repository: inside callback after save call
- In repository: inside callback before resolve
- In service after promise resolve
I would like to get the following sequence of logs:
- In controller: before service call
- In service before promise resolve
- In repository: before save call
- In repository: inside callback after save call
- In repository: inside callback before resolve
- In service after promise resolve
- In controller: after service call