I want to clean up my project a bit and now i try to use es6 classes for my routes. My problem is that this is always undefined.
var express = require('express'); var app = express(); class Routes { constructor(){ this.foo = 10 } Root(req, res, next){ res.json({foo: this.foo}); // TypeError: Cannot read property 'foo' of undefined } } var routes = new Routes(); app.get('/', routes.Root); app.listen(8080);
Finally es6 classes have landed in Node.
js server. The express. Router() function is used to create a new router object. This function is used when you want to create a new router object in your program to handle requests. Multiple requests can be easily differentiated with the help of the Router() function in Express.
You can use an npm moduleYou can group your middlewares as an array and pass it to the express-inject-middleware... Show activity on this post. in express 4 to grouping your routes, you should create some changes : seperate route files in multiple files like admin and front.
Express uses path-to-regexp for matching the route paths; see the path-to-regexp documentation for all the possibilities in defining route paths.
try to use the code to pin this
:
app.get('/', routes.Root.bind(routes));
You can get out of the boilerplate using underscore bindAll function. For example:
var _ = require('underscore'); // .. var routes = new Routes(); _.bindAll(routes, 'Root') app.get('/', routes.Root);
I also found that es7 allows you to write the code in a more elegant way:
class Routes { constructor(){ this.foo = 10 } Root = (req, res, next) => { res.json({foo: this.foo}); } } var routes = new Routes(); app.get('/', routes.Root);
This is happening because you've passed a method as a standalone function to express. Express doesn't know anything about the class that it comes from, therefore it doesn't know which value to use as this
when your method is called.
You can force the value of this
with bind
.
app.get('/', routes.Root.bind(routes));
Or you can use an alternative construct for managing routes. You can still make use of a lot of the syntactic benefits for object oriented programming without classes.
function Routes() { const foo = 10; return { Root(req, res, next) { res.json({ foo }); } }; } const routes = Routes(); app.get('/', routes.Root); app.listen(8080);
this
new
or notbind
on each routeThere's a good list of resources here, on why ES6 classes are not as good as they might seem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With