无法使用Nodejs-express向Cloudant-bluemix数据库发出PUT请求

时间:2015-08-20 06:20:43

标签: node.js http put ibm-cloud cloudant

我正在尝试实施密码重置。所以我拿着用户的电话号码,使用电话号码从数据库中获取文档以找到它,我正在使用新密码并尝试使用我的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和新修订版   更新失败时的错误消息。

2 个答案:

答案 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);
});