суббота, 25 сентября 2010 г.

node.js + couchdb

Использование CouchDB с узлом.js





Apache CouchDB это документ-ориентировочная база данных, которая может делать запросы

и индексироваться в стиле MapReduce, используя JavaScript. CouchDB также предлагает пошаговую репликацию

с двусторонним обнаружением конфликта и его разрешением.



Для начала установите CouchDB.Вы можете скачать CouchDB здесь.

Следующи шаг - установите npm, потому что все клевые пакеты node - в npm:)

Node имеет поддержку в HTTP лучше, чем любой язык, с которым я когда-либо работал и по совпадению интерфейс CouchDB

доступен исключительно через HTTP. Для начала, давайте просто познакомимся с CouchDB, используя HTTP библиотеку и позже

мы посмотрим на некоторые высшие абстракции.





Знакомство с CouchDB, используя запрос



npm install request



Это упрощенный клиент HTTP, который находится в довольно широком использовании среди разработчиков node.Давайте получим

список всех баз данных в вашем CouchDB.





var sys = require('sys')

, request = require('request')

, h = {accept:'application/json', 'content-type':'application/json'}

;

request({uri:'http://myname.couchone.com:5984/_all_dbs', headers:h}, function (err, response, body) {

console.log(sys.inspect(JSON.parse(body)));

})



Если ваш CouchDB - только что установленный, вы увидете что-нибудь подобное этому.

[ '_users' ]



Сейчас давайте создадим базу данных. Вы можете легко зделать это в Futon, веб интерфейсе для CouchDB, но веселей будет зделать

это в node.

request({uri:'http://myname.couchone.com:5984/dbname', method:'PUT', headers:h}, function (err, response, body) {

if (err) throw err;

if (response.statusCode !== 201) throw new Error("Could not create database. "+body);

})



Код ошибки фактически является ошибоками из HTTP клиента. Ни один правильный HTTP ответ не будет иметь

кода ошибки, поэтому если вы хотите проверить правильность созданной базы данных, нам нужно проверить код ответа.



Если вы вышли из режима Админ и создали админскую учетную запись (что вы должны сделать)

вы получите ошибку в которой говориться о том что вам нужно быть админом для того чтобы создавать новые базы данных

Авторизация типа basic поддерживаеться в CouchDB и в запросе, так что мы только добавим их к url.

request({uri:'http://myaccount:password@myname.couchone.com:5984/dbname', method:'PUT', headers:h}, function (err, response, body) {

if (err) throw err;

if (response.statusCode !== 201) throw "Could not create database. "+body;

})



все просто.

Сейчас давайте создадим и получим несколько документов

var dburi = 'http://myaccount:password@myname.couchone.com:5984/dbname'

request({uri:dburi, method:'POST', body:JSON.stringify({data:'somedata'})}, function (err, resp, b) {

if (err) throw err;

if (resp.statusCode !== 201) throw new Error("Could not create document. "+b);

console.log(b);

})



Вы увидете в console print что-нибудь подобное этому.

{"id":"8s7dhf8s7dah8f7sdf8dh", "rev":"1-7sdfy87s", seq:1}



Поскольку мы не имели id для этого документа, мы сделали POST к dburi и это создало новое id для нас. Если мы имеем

что-нибудь, что уже имеет определенный id, подобно тому мы имеем JSON тело твита от твитера API, мы

должны использовать id и использовать вызов PUT.

tweet._id = 'twitter-'+tweet.id

request({uri:dburi+'/'+tweet._id, method:'PUT', body:JSON.stringify(tweet)}, function (err, resp, b) {

if (err) throw err;

if (resp.statusCode !== 201) throw new Error("Could not create document. "+b);

console.log(b);

})



И мы должны увидеть чтото вроде етого

{"id":"twitter-192837218", "rev":"1-3dfy87s", seq:2}



Мы можем получить етот документ запросом GET

request({uri:dburi+'/twitter-192837218'}, function (err, resp, b) {

if (err) throw err;

if (resp.statusCode !== 200) throw new Error("Could not get document. "+b);

console.log(sys.inspect(JSON.parse(b)));

})



Или мы можем получить множество документов используя all_docs api.

request({uri:dburi+'/_all_docs?startkey="twitter-"&endkey="twitter-ZZZ"&include_docs=true'}, function (err, resp, b) {

if (err) throw err;

if (resp.statusCode !== 200) throw new Error("Could not get document. "+b);

console.log(sys.inspect(JSON.parse(b)));

})



all_docs API также позволяет фильтрацию startkey и endkey параметров на id, так что запрос подобно этому только даст нам

обратно документы твитера.



Для создания индексов и запрашивания их, я рекомендую вам почитать O'Reilly's CouchDB The Definitive Guide где всё доступно

изложено.





Знакомство с CouchDB, используя node-couchdb



Для некоторых людей прямое использование HTTP API может быть немного долговатым.существует 4 или 5 node библиотек которые

предоставляют высшие абстракции, но только у меня есть время говорить про node-couchdb.



создавать db просто

var couchdb = require('node-couchdb/lib/couchdb')

client = couchdb.createClient(5984, 'myname.couchone.com'),

db = client.db('my-db');

db.exists(function (err, exists) {

if (!exists) db.create();

})



создавать документ так же просто

db.saveDoc('my-doc', {awesome: 'couch fun'}, function(er, ok) {

if (er) throw new Error(JSON.stringify(er));

console.log('Saved my first doc to the couch!');

});

получить документ еще проще

db.getDoc('my-doc', function(er, doc) {

if (er) throw new Error(JSON.stringify(er));

console.log('Fetched my new doc from couch:');

console.log(doc);

});



Получить все документы - еще про... паждите паждите ... ще!

db.allDocs(function (err, resp) {

...

})

db.allDocs({startkey:'twitter-', endkey:'twitter-ZZZ'}, function (err, resp) {

...

})





Знакомство с couch используя creationix's couch-client



Tim Caswell только что запустил свой собственный клиент CouchDB и начал выполнять инструкции приведенные ниже.

модуль couch-client ето гибрид между http помощником запросов и полностью абстрактным драйвером базы данных.



подключение к базе данных простое

var CouchClient = require('couch-client');

var Users = CouchClient("http://username:password@yourhost:5984/users");



Если база данных не существует вы получите ошибки, но это легко сделать с помощью выставленой функцией request

Users.request("PUT", "/users", function (err, result) {

});



как видите, вы можете зделать любой произвольный http запрос используя функцию request(). Она располагаеться между 2 и 4 аргументом

CouchClient#request(method, path[, body][, callback])



Если вы оставите повторный вызов, это вернет движение вместо этого. Повторный вызов, если указано получают два аргумента

callback(err, result). err исключительный обьект если чтото пошло не так.

result ответ от couch уже JSON.parseed



так же для лучшего представления,couch-client имеет несколько utility функций которые исполнят общие задачи со всеми красиво

представлеными встроеными штуками.Это имеет соединение объединяющее, http keep-alive, и соединение запроса используя couch's bulk APIs



* CouchClient#save(doc, callback) -сохранить документ

* CouchClient#get(key, callback) -получить документ

* CouchClient#remove(key/doc, callback) -удалить документ

* CouchClient@changes(since, callback) -наблюдения за изменениями во всей базе данных с since and вызовы callback один раз за именение (експерементально)


Комментариев нет: