【问题标题】:CouchDb 2.1.1 Admin API Compaction PUT RequestCouchDb 2.1.1 Admin API 压缩 PUT 请求
【发布时间】:2018-02-20 16:51:13
【问题描述】:

我正在使用 CouchDB 2.1.1 在 NodeJS 中工作。

我正在使用 http.request() 方法通过 CouchDB API 设置各种配置设置。

这是他们的 API 参考,是的,我读过:

Configuration API

这是一个设置日志记录级别的工作请求示例:

const http = require('http');

var configOptions = {
    host: 'localhost',
    path: '/_node/couchdb@localhost/_config/',
    port:5984,
    header: {
        'Content-Type': 'application/json'
    }
};

function setLogLevel(){
    configOptions.path = configOptions.path+'log/level';
    configOptions.method = 'PUT';
    var responseString = '';
    var req = http.request(configOptions, function(res){
        res.on("data", function (data) {
            responseString += data;
        });
        res.on("end", function () {
            console.log("oldLogLevel: " + responseString);
        });
    });

    var data = '\"critical\"';

    req.write(data);
    req.end();
}

setLogLevel();

我不得不转义所有引号等,这是意料之中的。

现在我正在尝试让 CouchDb 接受压缩设置。

问题是我试图将相同的请求复制到不同的设置,但该设置没有简单的结构,尽管它似乎也“只是一个字符串”。

CouchDB API 就无效的 JSON 格式向我大喊大叫,我尝试了一大堆转义序列,并尝试以各种方式解析 JSON,以使其按照我认为的方式运行。

我可以使用Chrome的Advanced Rest Client发送这个payload,并且成功了:

Request Method: PUT
Request URL: http://localhost:5984/_node/couchdb@localhost/_config/compactions/_default
Request Body:  "[{db_fragmentation, \"70%\"}, {view_fragmentation, \"60%\"}, {from, \"23:00\"}, {to, \"04:00\"}]"

这会返回“200 OK”

当我在我的节点应用程序中执行以下函数时,我得到以下响应:

{"error":"bad_request","reason":"invalid UTF-8 JSON"}

function setCompaction(){
    configOptions.path = configOptions.path+'compactions/_default';
    configOptions.method = 'PUT';
    var responseString = '';
    var req = http.request(configOptions, function(res){
        res.on("data", function (data) {
            responseString += data;
        });
        res.on("end", function () {
            console.log("oldCompaction: " + responseString); 
        });
    });

    var data = "\"[{db_fragmentation, \"70%\"}, {view_fragmentation, \"60%\"}, {from, \"23:00\"}, {to, \"04:00\"}]\"";

    req.write(data);
    req.end();
}

有人可以指出我在这里缺少什么吗?

提前致谢。

【问题讨论】:

    标签: json node.js escaping couchdb config


    【解决方案1】:

    您需要使用节点的 JSON 模块来准备数据进行传输:

    var data = '[{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "23:00"}, {to, "04:00"}]';
    
    // Show the formatted data for the requests' payload.
    JSON.stringify(data);
    
    > '"[{db_fragmentation, \\"70%\\"}, {view_fragmentation, \\"60%\\"}, {from, \\"23:
    00\\"}, {to, \\"04:00\\"}]"'
    
    // Format data for the payload.
    req.write(JSON.stringify(data));
    

    【讨论】:

    • 我想我试过了,但当时可能有某种程度的“逃脱角色”地狱正在发生。编辑:这工作 - 谢谢!
    • 那个特殊的 CouchDB 设置很容易被误解 - 乍一看它看起来像一个 JavaScript 对象,但它实际上只是一个不透明的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2011-12-09
    相关资源
    最近更新 更多