diff --git a/common/models/user.js b/common/models/user.js index 1ef3ad46..94380b7a 100644 --- a/common/models/user.js +++ b/common/models/user.js @@ -626,17 +626,15 @@ module.exports = function(User) { } ); - UserModel.on('attached', function() { - UserModel.afterRemote('confirm', function(ctx, inst, next) { - if (ctx.args.redirect !== undefined) { - if (!ctx.res) { - return next(new Error('The transport does not support HTTP redirects.')); - } - ctx.res.location(ctx.args.redirect); - ctx.res.status(302); + UserModel.afterRemote('confirm', function(ctx, inst, next) { + if (ctx.args.redirect !== undefined) { + if (!ctx.res) { + return next(new Error('The transport does not support HTTP redirects.')); } - next(); - }); + ctx.res.location(ctx.args.redirect); + ctx.res.status(302); + } + next(); }); // default models diff --git a/lib/model.js b/lib/model.js index d88d0fb8..c9e1da25 100644 --- a/lib/model.js +++ b/lib/model.js @@ -187,36 +187,40 @@ module.exports = function(registry) { // before remote hook ModelCtor.beforeRemote = function(name, fn) { - var self = this; - if (this.app) { - var remotes = this.app.remotes(); - var className = self.modelName; + var className = this.modelName; + this._runWhenAttachedToApp(function(app) { + var remotes = app.remotes(); remotes.before(className + '.' + name, function(ctx, next) { fn(ctx, ctx.result, next); }); - } else { - var args = arguments; - this.once('attached', function() { - self.beforeRemote.apply(self, args); - }); - } + }); }; // after remote hook ModelCtor.afterRemote = function(name, fn) { - var self = this; - if (this.app) { - var remotes = this.app.remotes(); - var className = self.modelName; + var className = this.modelName; + this._runWhenAttachedToApp(function(app) { + var remotes = app.remotes(); remotes.after(className + '.' + name, function(ctx, next) { fn(ctx, ctx.result, next); }); - } else { - var args = arguments; - this.once('attached', function() { - self.afterRemote.apply(self, args); - }); - } + }); + }; + + ModelCtor.afterRemoteError = function(name, fn) { + var className = this.modelName; + this._runWhenAttachedToApp(function(app) { + var remotes = app.remotes(); + remotes.afterError(className + '.' + name, fn); + }); + }; + + ModelCtor._runWhenAttachedToApp = function(fn) { + if (this.app) return fn(this.app); + var self = this; + self.once('attached', function() { + fn(self.app); + }); }; // resolve relation functions @@ -383,15 +387,10 @@ module.exports = function(registry) { */ Model.getApp = function(callback) { - var Model = this; - if (this.app) { - callback(null, this.app); - } else { - Model.once('attached', function() { - assert(Model.app); - callback(null, Model.app); - }); - } + this._runWhenAttachedToApp(function(app) { + assert(Model.app); + callback(null, Model.app); + }); }; /** diff --git a/package.json b/package.json index beae727c..3332b280 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "nodemailer-stub-transport": "^0.1.5", "serve-favicon": "^2.2.0", "stable": "^0.1.5", - "strong-remoting": "^2.13.2", + "strong-remoting": "^2.15.0", "uid2": "0.0.3", "underscore.string": "^3.0.3" }, diff --git a/test/model.test.js b/test/model.test.js index db05e13e..29e0fef8 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -219,6 +219,24 @@ describe.onServer('Remote Methods', function() { }); }); + describe('Model.afterRemoteError(name, fn)', function() { + it('runs the function when method fails', function(done) { + var actualError = 'hook not called'; + User.afterRemoteError('login', function(ctx, next) { + actualError = ctx.error; + next(); + }); + + request(app).get('/users/sign-in?username=bob&password=123') + .end(function(err, res) { + if (err) return done(err); + expect(actualError) + .to.have.property('message', 'bad username and password!'); + done(); + }); + }); + }); + describe('Remote Method invoking context', function() { describe('ctx.req', function() { it('The express ServerRequest object', function(done) {