Hapi.js - 添加检查每条路线的机制

时间:2016-09-30 12:43:19

标签: javascript node.js hapijs

我正在尝试实现一个在任何路由被命中之前运行的机制。在该机制中,我想从头部获取一个值并检查身份验证。

我想出了这个: server.js:

// Create a server with a host and port
'use strict';

var Hapi = require('hapi');
var mongojs = require('mongojs');

var plugins = [      
  require('./routes/entities')
];
var server = new Hapi.Server();
server.connection({
   port: 3000
});
//Connect to db
server.app.db = mongojs('hapi-rest-mongo', ['entities']);

server.app.checkHeader = function (request) {
var header = request.headers['x-authorization'];
if(header === "letmein"){
    return true
}
return false
};
  //Load plugins and start server
server.register(plugins, function (err) {

if (err) {
    throw err;
}

// Start the server
server.start(function (err) {
    console.log('Server running at:', server.info.uri);
   });
 });

和routes.entities:

'use strict';

var Boom = require('boom');
var uuid = require('node-uuid');
var Joi = require('joi');

exports.register = function (server, options, next) {

var db = server.app.db;

server.route({
    method: 'GET',
    path: '/entities',
    handler: function handler(request, reply) {

        if(!server.app.checkHeader(request))
        {
            return reply(Boom.unauthorized());

        };

         //request.server.myFunc();
        db.entities.find(function (err, docs) {

            if (err) {
                return reply(Boom.wrap(err, 'Internal MongoDB error'));
            }

            reply(docs);
        });
    }
});

因此,在启动服务器时,我已经注册了我的函数 server.app.checkHeader

在我称之为路线并向其发送请求对象的路线中。请求对象包含有关标题的信息。

虽然这有效,但我感觉我并没有遵循Hapi的最佳实践。

我怎么能更优雅地做到这一点?

1 个答案:

答案 0 :(得分:2)

有几个选择。

当然,您可以使用request lifecycle - 注意路由处理程序之前管道中发生的事件。

尽管如此,我强烈建议你考虑实施一个auth策略,可以将其设置为所有路由的默认策略,或者选择性地在适当的路由上设置。