hapi plugin that registers server methods using nano and extends it by taking care of cookie authentication
hapi-relax enhances your hapi server by an interface for a specified CouchDB database.
If you're using cookie authentication on top of basic-auth you can also pass a username and password. Just relax and stop worrying about authentication because the plugin will check if you are authorized. If not it will use nano's auth method to get a cookie and use that in a further request. But you won't notice because that all happens internally.
It will also update its cookie when CouchDB sends a new cookie in the headers.
var Hapi = require('hapi');
var server = new Hapi.Server();
var options = { nano: { db: 'testDb' } };
server.connection({ port: 80 });
server.register({ register: require('hapi-relax'), options }, function(err) {
});
server.start();
The plugin takes the following options:
nano
- optional config object which nano will be initialized with.
db
is required. Defaults to{ url: 'http://localhost:5984' }
user
- optional database usernamepassword
- optional password for your database user; required if user is passedprefix
- optional namespace in which the server methods will be registered;
required if the plugin is registered multiple times e.g. for multiple databases or hosts. Defaults tonano
nano's API remains unchanged
- info
- replicate
- compact
- changes
- follow
- session
- insert
- get
- head
- copy
- destroy
- bulk
- list
- fetch
- fetchRevs
- show
- atomic
- updateWithHandler
- search
- spatial
- view
- viewWithList
- multipart: {insert, get}
- attachment: {insert, get, destroy}
var Hapi = require('hapi');
var server = new Hapi.Server();
server.connection({ port: 8080 });
var plugins = [{
register: require('hapi-relax'),
options: {
nano: {
url: 'http://localhost:5984',
db: 'db1'
},
user: 'root',
password: 'secret'
}
},
{
register: require('hapi-relax'),
options: {
nano: {
url: 'http://localhost:5984',
db: 'db2'
},
user: 'alice',
password: 'rabbit',
prefix: 'db2'
}
}];
server.register(plugins, function (err) {
if (err) {
throw err;
}
});
server.route({
method: 'GET',
path: '/db1/{key}',
handler: function (request, reply) {
var key = encodeURIComponent(request.params.key);
server.methods.nano.get(key, function (err, body, headers) {
if (err && err.reason === 'missing') {
reply('Document does not exist').code(404);
}
else {
reply(body);
}
});
}
});
server.route({
method: 'GET',
path: '/db2/{key}',
handler: function (request, reply) {
var key = encodeURIComponent(request.params.key);
server.methods.db2.get(key, function (err, body, headers) {
if (err && err.reason === 'missing') {
reply('Document does not exist').code(404);
}
else {
reply(body);
}
});
}
});
server.start(function () {
console.log('Server running at:', server.info.uri);
});