попробуйте поймать — Cloudant и Php-on-Couch не работают из-за продолжения

Я считаю, что Cloudant недавно изменил некоторые из их кода. В последнее время, если вы выполняете операцию storeoc, в операторе try / catch. Cloudant вернет «ошибку» в фреймворк:

Uncaught исключение «couchException» с сообщением «Продолжить

Конечно, вы можете справиться с этим в операторе catch, но он действительно должен вернуться как «успешный» в операторе Try библиотеки PHP-on-Couch.

Кто-нибудь сталкивался с этим или знает, как с этим справиться? Самая большая проблема в том, что вы не можете получить ID и Rev в операторе catch, потому что это выглядит как ошибка:

                try { // does not return here, goes to catch
$response = $client->storeDoc($doc);
$response_json['status'] = 'success';
$response_json['id'] = $response->id;
$response_json['rev'] = $response->rev;
} catch (Exception $e) { // even though the doc is successfully storing

// check for accepted BEG
$error = '';
$error = $e->getMessage();
$err_pos = strpos($error,"Accepted");
$err_pos_2 = strpos($error,"Continue");
if($err_pos !== false OR $err_pos_2 !== false){ // success

$response_json['status'] = 'success';
$response_json['id'] = $response->id; // returns null
$response_json['rev'] = $response->rev; // returns null

} else { // truely an error

$response_json['status'] = 'fail';
$response_json['message'] = $e->getMessage();
$response_json['code'] = $e->getCode();

}
// check for accepted END}

1

Решение

Я тестировал как в CouchDB, так и в Cloudant, и поведение такое же. Это то, что я считаю, происходит. Когда вы создаете новый документ couchDocument:

$doc = new couchDocument($client);

По умолчанию для документа установлено автоматическое принятие. Вы можете увидеть это в couchDocument.php:

function __construct(couchClient $client) {
$this->__couch_data = new stdClass();
$this->__couch_data->client = $client;
$this->__couch_data->fields = new stdClass();
$this->__couch_data->autocommit = true;
}

Как только вы установите свойство в документе:

$doc->set( array('name'=>'Smith','firstname'=>'John') );

storeDoc немедленно называется. Вы тогда пытаетесь позвонить storeDoc второй раз и couchDB возвращает ошибку.

Есть 2 способа это исправить:

  1. Отключить автокоммит:

    $doc = new couchDocument($client);
    $doc->setAutocommit(false);
    $doc->set( array('name'=>'Smith','firstname'=>'John') );
    try {
    $response = $client->storeDoc($doc);
    $response_json['status'] = 'success';
    $response_json['id'] = $response->id;
    $response_json['rev'] = $response->rev;
    
  2. Оставьте автокоммит включенным и получите id и rev от $doc после того, как вы установите свойство:

    $doc = new couchDocument($client);
    try {
    $doc->set( array('name'=>'Smith','firstname'=>'John') );
    $response_json['status'] = 'success';
    $response_json['id'] = $doc->_id;
    $response_json['rev'] = $doc->_rev;
    
0

Другие решения

Других решений пока нет …