bones
bones copied to clipboard
Express 3.x
Hi,
What do you think about Express 3.x? Would you suggest upgrading to it if we could?
Thanks.
This is pretty tricky because express/connect changed the way servers are constructed. In Express 2.x, the app object inherited directly from HTTPserver, but in Express 3.x, this is just a wrapper and Express has its own application object.
In Bones, servers are "Classes" (in lack of a better term) that can be instantiated and then attached to another server or started as the root server. This means that on every instantiation, we'd have to create a server with express(), but in this case, the Bones Server object doesn't have all the .use(), .get() etc. functions, so this would break backwards-compatibility.
Another idea is to base Bones Server objects on express' application prototype and on instantiation, create a new express() server and swap out the __proto__ underneath it with the current object's prototype, and return that newly created object. This seems to be super hackish though and I'm not sure we should go down that route.
/cc @Vertice
The third option of course is to break backwards compatibility and move to a system that doesn't warp express servers into another Bones layer. The user would create an express server as normal and return that from the ServerName.bones.js file. The calling party could then either start the server or piggy-back it onto another server with .use(). Of course this means that it's nigh impossible to instantiate the same server twice. This could be restored by keeping the wrapping functionality and changing all calls in the initialize function from this.get() to this.app.get() etc.
I'm not completely up to date on what is happening in express 3 (other than the templating changes), but why not just have the base server class instantiate the application, and then assign all the methods you want to redirect to the application.
// in a loop, obviously. this.get = _.bind(this.app.get, this.app);
it's not like backbone and underscore dont do this kind of thing either, so i'm pretty sure it's kosher.
Hi,
express-resource seems have a similar approach with @Vertice suggested, except it's not a redirect but a wrap.
/**
* Setup http verb methods.
*/
methods.concat(['del', 'all']).forEach(function(method){
Resource.prototype[method] = function(path, fn){
if ('function' == typeof path
|| 'object' == typeof path) fn = path, path = '';
this.map(method, path, fn);
return this;
}
});
I think we could do the same.
Please update to Express 4.x.