Use fibers, it would allow you to write plain good old Ruby / Python like 
code without callbacks & at the same time preserve non-blocking node.js 
features.

Here's an example of 
Controller 
https://github.com/sinizinairina/mono-example/blob/master/controllers/Posts.coffee
it looks like synchronous code, but it's not blocking.

On Thursday, 22 October 2015 02:01:32 UTC+11, Adam wrote:
>
> 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
>

-- 
Job board: http://jobs.nodejs.org/
New group rules: 
https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/nodejs/81103d7f-b85d-4031-946f-f8a54b877899%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to