nodejs服务器用于注册couchdb用户

时间:2013-12-16 10:37:45

标签: android json node.js couchdb

我在couchdb服务器上为注册用户使用nodejs服务器。

我的想法是我的Android应用程序向nodejs服务器发送ajax注册请求。 nodejs服务器将该请求转发给couchdb服务器,然后将couchdb服务器响应转发给android应用程序。

这是nodejs服务器的代码:

var dispatcher = require('httpdispatcher');
var request = require('request-json');

dispatcher.onOptions("/_users", function(req, res){
    res.writeHead(204, {'Access-Control-Allow-Origin':req.headers.origin,
        'Access-Control-Allow-Methods': 'GET, PUT, POST, HEAD, DELETE',
        'Access-Control-Allow-Headers': 'authorization, x-titanium-id, content-type',
        'Access-Control-Allow-Credentials': 'true'
    });
    res.end();
});

dispatcher.onPost("/_users", function(appReq, appRes) {
    var client = request.newClient('http://localhost:5984/');
    client.setBasicAuth('admin', 'adminPassword');
    var data = JSON.parse(appReq.body);

    client.post('_users', data, function(err, res, body) {
        var appResHeader = res.headers;
        appResHeader['Access-Control-Allow-Origin'] = appReq.headers.origin;
        appResHeader['Access-Control-Allow-Methods'] = 'GET, PUT, POST, HEAD, DELETE';
        appResHeader['Access-Control-Allow-Headers'] = 'authorization, x-titanium-id, content-type';
        appResHeader['Access-Control-Allow-Credentials'] = 'true';
        console.log(JSON.stringify(body));
        appRes.writeHead(res.statusCode, appResHeader);
        appRes.write(JSON.stringify(body));
        appRes.end();
    });
}); 

dispatcher.onError(function(req, res) {
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end('Page Not Found\n');
});

一切正常,但Android应用程序收到的响应不包含JSON数据。

请注意     的console.log(JSON.stringify(体));

正确打印json数据:

{"error":"conflict","reason":"Document update conflict."}

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

假设您已了解文档更新冲突(请参阅CouchDB's documentation),并且您的应用程序将此数据返回给Android客户端是正常的。

您不需要自己对结果对象进行字符串化,而是express take care of it。它将正确地对其进行字符串化并发送正确的标题:

appRes.json(res.statusCode, body);

对于CORS来说也是如此,您可以使用为您做所有事情的中间件,例如cors