我在Bluemix上的Node.js Web应用程序中使用Cloudant Lite服务

时间:2017-01-12 19:15:25

标签: node.js error-handling ibm-cloud cloudant

当我执行从关联的Web应用程序访问Cloudant数据库的特定功能时,我在Node.js控制台窗口中收到以下错误:

  

"错误:您已超过当前查询类别"每秒5个请求的限制。

我在Chrome网络浏览器中收到了相应的错误:

  

" MethodHubFrontend-1.1.0.js:32 POST http://cognitivehub.w3ibm.mybluemix.net/api/export/archive 500(内部服务器错误)"。

我们的应用程序使用Cloudant Lite服务在Bluemix Dedicated(CIO)上运行。是什么导致了这些错误?是因为我们在Cloudant Lite中超过了每秒5个查询的吞吐量限制吗?

Cloudant Standard中是否有选项,而不是每秒提供50个查询的选项,我们可以使用?

我们应该如何处理Node.js服务器中的错误,以便返回3xx错误代码而不是500错误代码?

2 个答案:

答案 0 :(得分:3)

  

导致这些错误的原因是什么?是因为我们在Cloudant Lite中超过了每秒5个查询的吞吐量限制吗?

是的,你是对的。您需要升级到标准计划以提高速率限制。有关详细信息,请查看Cloudant Web控制台中帐户选项卡中的详细信息。

  

Cloudant Standard中是否有选项,而不是每秒提供50个查询的选项,我们可以使用?

有几个级别,如帐户>中所列。 容量标签。

  

另外,我们应该如何处理Node.js服务器中的错误,以便返回3xx错误代码而不是500错误代码?

Cloudant应返回HTTP代码429(Too Many Requests)。您的应用可以通过两种方式响应此错误情况 - 失败或重新发送请求。

答案 1 :(得分:-1)

过去几天我遇到了同样的错误。这是我正在使用的代码。我认为这个问题与nodejs异步性质有关,而且没有正确使用回调,因此代码/请求可以同时异步发送,而不是异步发送。

  

错误:您已超出查询类

每秒5个请求的当前限制

我在向Cloudant Service提出的每个请求之间等待1秒等待时间。我觉得服务有问题。

// Used to add sleep time between calls to cloudant
var sleep = require('sleep'); 
const winston = require('winston')
var action_result = null
winston.level = 'debug';
var dbCredentials = {
    dbName: 'testdb'
};
var feed = 1;
//Intialize DB for putting records in Cloudant.
dbCredentials.url = "https://replace with your URL-bluemix:replacewith your URL-bluemix.cloudant.com";
cloudant = require('cloudant')(dbCredentials.url);

// check if DB exists if not create a  testdb database
cloudant.db.create(dbCredentials.dbName, function(err, data) {
winston.log("debug","create a test database Error:", err);
winston.log("debug","create a test database Data:", data);      
});

dbnames = cloudant.db.use(dbCredentials.dbName);
winston.log("debug","Creating a record in  database %s" , dbCredentials.dbName);

//  Insert a one second timeout delay to not exceed 5 queries every 1 second in Cloudant API
winston.log("debug","Reproduce timeout error First SLEEP 5 minutes---------------  FIND Time is %d ", new Date().getTime() / 1000 );
sleep.sleep(1);
//Check if the asset action already exists.
dbnames.find({selector:{feed:feed }}, function(er, action_result) {
sleep.sleep(5);
    if (er) {
        winston.log("debug",'[db.find]  Error Message %s', er.message);
throw er;
     }
});
    if ( action_result !== null) {
    winston.log("debug",'Reproduce timeout error found results %d documents.', action_result.docs.length);
    return action_result;
 }else{
        winston.log("debug",'Reproduce timeout error before loop');
        for (var i = 0; i < 1000; i++) {
            winston.log("debug","Reproduce timeout error SLEEP item %d ---------------  FIND Time is %d " ,i,  new Date().getTime() / 1000 );
            sleep.sleep(1);
            dbnames.insert(docData (i, new Date().getTime() / 1000),     function(err, body, header) {
                    if (err) {
                        return winston.log("debug",'[db.insert] ', err.message);
                    }       
                    winston.log("debug",'You have inserted the doc.');
                    expert_exists = false;
                });
        }; //End Loop
}; //End Else

function docData (number, timestring) {
    var responseData = {
            feed : number,
            time : timestring,
    };   
    return responseData;  
}