我正在尝试实施密码重置。所以我拿着用户的电话号码,使用电话号码从数据库中获取文档以找到它,我正在使用新密码并尝试使用我的Cloudant数据库中的PUT请求更新相应的文档。
app.post('/pass_rst', function(req,response){
var log='';
//log is just for me to see what's happening
var phone= req.body.phone;
log+=phone+'\n';
db.find({selector:{'phone':phone}}, function(err, result){
if(err){
throw err;
}
if(result.docs.length==0){
response.send('User doesnt exist');
}else{
var existing_data=result.docs[0];
log+=JSON.stringify(existing_data)+'\n';
var upd_pswd= req.body.new_password;
log+=upd_pswd+'\n';
var new_data=existing_data;
new_data.password=upd_pswd;
log+=JSON.stringify(new_data)+'\n';
var id= result.docs[0]._id;
log+=id+'\n';
//make PUT request to db
var options={
host:dbCredentials.host,
port:dbCredentials.port,
path:'/'+dbCredentials.dbName+'/'+id,
//url: dbCredentials.url+'/'+dbCredentials.dbName+'/'+id,
method:'PUT',
json:new_data,
headers:{
'Content-Type':'application/json',
'accept':'*/*'
}
};
log+=JSON.stringify(options)+'\n';
var httpreq= http.request(options);
//log+=JSON.stringify(httpreq);
httpreq.on('error', function(e){
response.send('Error'+e.message);
});
response.send(log+'\n\n\nUpdated');
}
});
});
dbCredentials的定义如下:
dbCredentials.host = vcapServices.cloudantNoSQLDB[0].credentials.host;
dbCredentials.port = vcapServices.cloudantNoSQLDB[0].credentials.port;
dbCredentials.user = vcapServices.cloudantNoSQLDB[0].credentials.username;
dbCredentials.password = vcapServices.cloudantNoSQLDB[0].credentials.password;
dbCredentials.url = vcapServices.cloudantNoSQLDB[0].credentials.url;
我已经尝试过修补它,但在最好的情况下,我没有收到错误,我看到“更新”但数据库中实际上没有发生任何事情。有时我会收到一条错误消息:502 Bad Gateway:已注册的端点无法处理请求。
如果你看到出了什么问题,请告诉我。谢谢。
这是有关如何在cloudant中更新文档的文档
更新
更新文件
PUT / $ DATABASE / $ DOCUMENT_ID HTTP / 1.1 {“_ id”:“apple”,“_ rev”: “1-2902191555”,“item”:“Malus domestica”,“price”:{ “新鲜超市”:1.59, “最高价”:5.99, “苹果快递”:0.79, “Gentlefop的Shackmart”:0.49}}
要更新(或创建)文档,请使用更新的PUT请求 JSON内容和最新的_rev值(创建新的不需要) 文件)到https://$USERNAME.cloudant.com/$DATABASE/$DOCUMENT_ID。
如果您未能提供最新的_rev,Cloudant将以409响应 错误。此错误可防止您覆盖其他人更改的数据 流程。如果无法满足写入仲裁,则响应为202 返回。
示例回复:{“ok”:true,“id”:“apple”,
“rev”:“2-9176459034”}响应包含文档的ID和新修订版 更新失败时的错误消息。
答案 0 :(得分:1)
我正在使用bluemix -nodejs和cloudant。对我来说,更新的最佳方法是使用nano包来从node.js进行数据库交互。
你可以参考这里的帖子: 总结是 - 通过使用nano api,您可以轻松更新记录。在使用nano时,您需要确保使用_id和右_rev数字。这个内部使用下面的PUT方法。
Updating and Deleting documents using NodeJS on Cloudant DB
当您包含nano时,请务必更新package.json以添加nano依赖项。如果您对更新/删除有其他疑问,请与我们联系
答案 1 :(得分:0)
使用cloudant node.js模块时,没有单独的更新功能。 您还需要使用db.insert函数进行具有正确文档修订的更新,因此您需要在插入之前阅读最新版本。
https://github.com/apache/couchdb-nano#document-functions
"还用于通过在保存的文档中包含_rev令牌来更新现有文档:"
// read existing document from db
db.get(key, function(error, existing) {
if (!error)
// use revision of existing doc for new doc to update
obj._rev = existing._rev;
// call db insert
db.insert(obj, key, cb);
});