20

我正在尝试使用 Node.js 连接到 Cloudant 上的 CouchDB 数据库。

这适用于外壳:

    curl https://weng:password@weng.cloudant.com/my_app/_all_docs

但是这个 node.js 代码不起作用:

    var couchdb = http.createClient(443, 'weng:password@weng.cloudant.com', true);
    var request = couchdb.request('GET', '/my_app/_all_docs', {
        'Host': 'weng.cloudant.com'
    });
    request.end();
    request.on('response', function (response) {
        response.on('data', function (data) {
            util.print(data);
        });
    });

它给了我这个数据:

    {"error":"unauthorized","reason":"_reader access is required for this request"}

如何使用 Node.js 列出我的所有数据库?

4

4 回答 4

18

内置的 Node.js http 客户端非常低级,它不支持开箱即用的 HTTP Basic auth。第二个参数http.createClient只是一个主机名。它不期望那里有凭据。

你有两个选择:

1.自己构造HTTP Basic Authorization header

var Base64 = require('Base64');
var couchdb = http.createClient(443, 'weng.cloudant.com', true);
var request = couchdb.request('GET', '/my_app/_all_docs', {
    'Host': 'weng.cloudant.com',
    'Authorization': 'Basic ' + Base64.encode('weng:password')
});
request.end();
request.on('response', function (response) {
    response.on('data', function (data) {
        util.print(data);
    });
});

您将需要一个 Base64 库,例如一个用 C 编写的用于节点的库,或者一个纯 JS 库(例如CouchDB Futon 使用的那个)。

2. 使用更高级的 Node.js HTTP 客户端

一个更有特色的 HTTP 客户端,比如Restler,会让上面的请求变得更容易,包括凭证:

var restler = require('restler');
restler.get('https://weng.cloudant.com:443/my_app/_all_docs', {
    username: 'weng',
    password: 'password'
}).on('complete', function (data) {
    util.print(data);
});
于 2010-11-02T22:24:42.943 回答
7

Node.js 有很多 CouchDB 模块。

于 2010-11-23T11:10:51.327 回答
5

只是想补充

  • nano - node.js 的简约 couchdb 驱动程序

到列表中。它由nodejitsu的 CCO Nuno Job 编写,并积极维护。

于 2013-04-18T15:01:17.983 回答
0

这个答案看起来有点过时了。这是我使用以下有效的 Cloudant Supported NPM Node Client 库验证的更新答案。 https://www.npmjs.com/package/cloudant#getting-started

要回答他关于如何列出他的数据库的问题,请使用以下代码。

//Specify your Cloudant Database Connection URL. For Bluemix format is: https://username:password@xxxxxxxxx-bluemix.cloudant.com

dbCredentials_url = "https://username:password@xxxxxxxxx-bluemix.cloudant.com"; // Set this to your own account 

// Initialize the library with my account. 
// Load the Cloudant library. 
cloudant = require('cloudant')(dbCredentials_url);

// List the Cloudant databases
cloudant.db.list(function(err, allDbs) {
console.log('All my databases: %s', allDbs.join(', ')) });
于 2017-01-04T05:30:15.377 回答