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.
