Получить документ с вложениями из CouchDB на Angular - PullRequest
0 голосов
/ 01 ноября 2019

У меня возникают некоторые проблемы, когда я пытаюсь вызвать конечную точку CouchDB, которая возвращает документ с вложениями на Angular. По умолчанию для получения какого-либо документа в CouchDB конечной точкой является host / database / docId, который возвращает документ без вложений. Для включения вложений в ответ необходимо передать в качестве параметров запроса attachments = true. Поэтому, когда я вызываю конечную точку host / database / docId, например, attachments = true в Postman, возвращает что-то вроде этого:

--27e6cca24322032bfdcf675f79cc0fb8
Content-Type: application/json

{"_id":"f4f1e09fa87677d0562ce9a5f300c5a4","_rev":"4-26cee6e26c8dd9ca809a6ab4e477ec48","descript":"testing attachments...","title":"test","_attachments":{"test.txt":{"content_type":"text/plain","revpos":4,"digest":"md5-t6aOnQrBAqiiZKaygsDknQ==","length":4,"follows":true,"encoding":"gzip","encoded_length":24}}}
--27e6cca24322032bfdcf675f79cc0fb8
Content-Disposition: attachment; filename="test.txt"
Content-Type: text/plain
Content-Length: 24
Content-Encoding: gzip

�

Ответ приходит так, потому что вложения включены в двоичном видеили блоб данных. Но для включения данных документа, как base64, в основном я добавляю параметр заголовка Accept с пустым значением, как будто я ожидаю что-либо получить. С заголовком Accept, почтальон правильно вернет json:

{
    "_id": "f4f1e09fa87677d0562ce9a5f300c5a4",
    "_rev": "4-26cee6e26c8dd9ca809a6ab4e477ec48",
    "descript": "testing attachments...",
    "title": "test",
    "_attachments": {
        "test.txt": {
            "content_type": "text/plain",
            "revpos": 4,
            "digest": "md5-t6aOnQrBAqiiZKaygsDknQ==",
            "data": "dGVzdA=="
        }
    }
}

Но на Angular это плохо работает. Когда я пытаюсь вызвать конечную точку с помощью Accept Header в первый раз, httpClient возвращает мне сообщение об ошибке «Ошибка Http во время анализа для host / database / docId? Attachments = true». Но, когда я звоню второй раз, он работает нормально. Я что-то не так делаю?

public async getDoc(database: string, id: string): Promise<any> {    
    const headers: HttpHeaders = new HttpHeaders().append("Content-Type", "application/json").append("Accept", "");
    const params: HttpParams = new HttpParams().set("attachments", "true");

    return await new Promise<any>(async(resolve, reject) => {
        // If I uncomment this, the second call will works normally, but this call will fail.
        // await this.http
        //      .get(this.url + "/" + database + "/" + id, { headers, params, withCredentials: true })
        //      .subscribe(resp => console.log(resp), err => console.log(err));
        await this.http
            .get(this.url + "/" + database + "/" + id, { headers, params, withCredentials: true })
            .toPromise()
            .then(resp => resolve(resp))
            .catch(err => reject(err));
    });
}
...