我在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."}
有什么想法吗?
答案 0 :(得分:3)
假设您已了解文档更新冲突(请参阅CouchDB's documentation),并且您的应用程序将此数据返回给Android客户端是正常的。
您不需要自己对结果对象进行字符串化,而是express take care of it。它将正确地对其进行字符串化并发送正确的标题:
appRes.json(res.statusCode, body);
对于CORS来说也是如此,您可以使用为您做所有事情的中间件,例如cors
。