Невозможно сделать запрос PUT к базе данных Cloudant-bluemix с помощью Nodejs-express

Я пытаюсь реализовать сброс пароля. Итак, я беру номер телефона пользователя, получаю документ из базы данных, используя номер телефона, чтобы найти его, и я беру новый пароль и пытаюсь обновить соответствующий документ, используя запрос PUT в моей базе данных Cloudant.

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", "prices": { "Fresh Mart": 1.59, «Максимальная цена»: 5,99, «Apples Express»: 0,79, «Gentlefop's Shackmart»: 0,49 } }

Чтобы обновить (или создать) документ, сделайте запрос PUT с обновленным содержимым JSON и последним значением _rev (не требуется для создания новых документов) на https://$USERNAME.cloudant.com/$DATABASE/$DOCUMENT_ID.

Если вы не предоставите последнюю версию _rev, Cloudant ответит ошибкой 409. Эта ошибка предотвращает перезапись данных, измененных другими процессами. Если кворум записи не может быть достигнут, возвращается ответ 202.

Пример ответа: { "ok":true, "id":"apple",
"rev":"2-9176459034" }

Ответ содержит идентификатор и новую версию документа или сообщение об ошибке в случае сбоя обновления.


person Chakradhar Thallapaka    schedule 20.08.2015    source источник
comment
Можете ли вы подключиться к базе данных и выполнить какие-либо другие операции CRUD?   -  person Ben Rondeau    schedule 20.08.2015
comment
Да, я использую библиотеку cloudant/nodejs github.com/cloudant/nodejs-cloudant. Мне удалось выполнить операции Create и Read с помощью функций db.insert и db.find, но я не уверен, есть ли функция db.update, поэтому я пытался сделать прямой запрос PUT к cloudant db. Это не сработало до сих пор.   -  person Chakradhar Thallapaka    schedule 21.08.2015


Ответы (2)


Я использую bluemix-nodejs и cloudant. Лучший способ, который помог мне выполнить обновление, — это использовать пакет nano для взаимодействия с базой данных из node.js.

Вы можете обратиться к сообщению здесь: Резюме: используя nano API, вы можете легко обновить запись. Вы должны обязательно использовать - _id и правильный номер _rev, пока вы используете nano. Этот inturn использует метод PUT внизу.

Обновление и удаление документов с помощью NodeJS в Cloudant DB

Когда вы включаете nano, обязательно обновите package.json, чтобы добавить зависимость nano. Дайте мне знать, если у вас есть дополнительные вопросы по обновлению/удалению

person vinSan    schedule 19.10.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person lin; 22.10.2015
comment
Хорошо..Добавил несколько строк, надеюсь, это поможет, Tx - person vinSan; 22.10.2015

При использовании модуля 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);
});
person Rene Meyer    schedule 21.08.2015
comment
Спасибо за комментарий. Я на самом деле попробовал этот метод, но все, что он сделал, это создал новый документ. Затем я перешел к отправке запроса PUT, как описано в облачных документах. docs.cloudant.com/document.html#update - person Chakradhar Thallapaka; 21.08.2015