So. I'm experiencing some quirks when attempting to implement some basic middleware for a Restify.js application I'm building with specific regard to next() and promise callbacks.
To express the problem in a generic form:
var server = restify.createServer({
name: config.name
});
Promise resolves:
server.use(function checkAcl(req, res, next) {
// Promise is resolved
var promise = function () {
var deferred = require('q').defer();
deferred.resolve();
return deferred.promise;
}
promise()
.then(function () {
next(); // doesn't get 'called', no response sent, connection eventually times out
}, function () {
res.send(new restify.NotAuthorizedError());
});
});
server.use(restify.bodyParser());
...
Promise is rejected
server.use(function checkAcl(req, res, next) {
// Promise is rejected
var promise = function () {
var deferred = require('q').defer();
deferred.reject();
return deferred.promise;
}
promise()
.then(function () {
next();
}, function () {
res.send(new restify.NotAuthorizedError()); // this works fine
});
}
});
server.use(restify.bodyParser());
...
Am I doing anything obviously wrong? Any insight? It certainly seems to been related to the promise callbacks, are they somehow suppressing the call to next()?
Adding the restify.bodyParser() middleware BEFORE the custom middleware resolves the issue.
n.b:
// Add bodyParser() to the stack before the custom middleware
server.use(restify.bodyParser());
server.use(function checkAcl(req, res, next) {
// Promise is resolved
var promise = function () {
var deferred = require('q').defer();
deferred.resolve();
return deferred.promise;
}
promise()
.then(function () {
next(); // next() now behaves as expected.
}, function () {
res.send(new restify.NotAuthorizedError());
});
});
...
Further to that, I eventually happened upon this Github issue describing the issue along with another possible solution if the order of your middleware matters (which it probably does).
mcavage: Pretty sure this is actually node that's biting you (as in your data is emitted to nowhere). Try this:
var server.createServer();
server.pre(restify.pre.pause());
...