Я считаю, что 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}
Я тестировал как в 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 способа это исправить:
Отключить автокоммит:
$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;
Оставьте автокоммит включенным и получите 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;
Других решений пока нет …