Search This Blog

2018/03/03

Express.js :Features

Express.js comes with lot of feature ,lets explore them step by step

what is res.locals in express.js ?

An object that contains response local variables scoped to the request,
and therefore available only to the view(s) rendered during that
request / response cycle (if any).This property is useful for exposing
request-level information such as the request path name, authenticated
user,user settings, and so on.
e.g.
app.use(function(req, res, next){
res.locals.user = req.user;
res.locals.authenticated = ! req.user.anonymous;
next();
});

what is app.locals in express.js ?

The app.locals object has properties that are local variables within the
application.Once set, the value of app.locals properties persist
throughout the life of the application.You can access local variables in
templates rendered within the application. This is useful for providing
helper functions to templates, as well as application-level data. Local
variables are available in middleware via req.app.locals.
e.g.
app.locals.title = 'My App';
app.locals.strftime = require('strftime');
app.locals.email = 'me@myapp.com';
in contrast with res.locals properties defined in app.locals are valid
only for the lifetime of the request.


How to remove 'x-powered-by' header:
to remove certain header you can use 'res.removeHeader' using a custom
middleware or can use 'app.disable'.
e.g.
app.use(function (req, res, next) {
res.removeHeader("X-Powered-By");
next();
});

or

app.disable('x-powered-by');

try to hit some route say GET for simplicity in POSTMAN and check below
header is present on response
X-Powered-By →Express

How to enable case-sensitive routing:
Inside our router definition we can pass 'caseSensitive=true'
var router = express.Router({
caseSensitive: true
});

other approach described below,but found to be not working
app.disable('case sensitive routing',false);

by making route case-sensitive we end up in /login is not same as
/LOGIN.so you will get 404 for /LOGIN if you defined only /login

Unhandled error:
In express router if we get an error and its not handled then it
trickle to app level.

consider below route

router.get('/uncaught', function (req, res,next) {
var Promise = require('bluebird');
var Pgb = require("pg-bluebird");
var pgb = new Pgb();
var connectionString = 'postgres://xdba:sangram@localhost:5432/xplay';
var cnn;

var query1 = 'select * from tbl_nowhere where channel_id=1';
console.log(query1);
return pgb.connect(connectionString)
.then(function (connection) {
cnn = connection;
return cnn.client.query(query1);
}).then(function (result) {
return result;
cnn.done();
})
.catch(function (error) {
throw error;
//next(error);
});
});

we are purposefully giving wrong table name in query so that we get an
error 'relation "tbl_nowhere" does not exist'.


when I am throwing an error in catch block it has been observed that
request does not halt,now let's replace 'throw error' by
'next(error)'.

Now error trickle down to app.js.To catch this unhandled error express.js
uses middleware.usually at bottom of app.js.here is how it looks like.


app.use(function (err, req, res, next) {
console.log('Env:' + app.get('env'));
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};

// render the error page
res.status(err.status || 500);
res.render('error');
});


what it does is check if application is running in developement mode or not,
if it is running in development mode then it loads error view with message &
stacktrace.On production environment we usually don't show such errors to
client but log them somewhere and show some generic error to user.

No comments:

Post a Comment