Функция Google Cloud - Хранилище - Удалить изображение - «ApiError: Ошибка во время запроса» - PullRequest
0 голосов
/ 19 ноября 2018

ОБНОВЛЕННЫЙ ВОПРОС

Проблема ApiError: Error during request.

Код:

import * as functions from 'firebase-functions';

const cors = require('cors')({ origin: true });

import * as admin from 'firebase-admin';

const gcs = admin.storage();

export const deleteImage = functions.https.onRequest((req, res) => {

    return cors(req, res, async () => {

        res.set('Content-Type', 'application/json');
        const id = req.body.id;
        const name = req.body.name;

        const imageRef = gcs.bucket(`images/${name}`);

        if (!name || !id) {
            return res.status(400).send({message: 'Missing parameters :/'});
        }

        try {
            await imageRef.delete();
            console.log('Image deleted from Storage');
            return res.status(200).send({status: 200, message: `Thank you for id ${id}`});
        }
        catch (error) {
            console.log('error: ', error);
            return res.status(500).send({message: `Image deletion failed: ${error}`});
        }

    });
});

И проблема здесь : await imageRef.delete();, я получаю следующую ошибку:

ApiError: ошибка во время запроса.

У меня действительно есть admin.initializeApp(); в одной из моих других функций, так что это не может быть проблемой, если только у GCF нет ошибки.

Ошибка глубины :

{ ApiError: Error during request.
    at Object.parseHttpRespBody (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/common/src/util.js:187:32)
    at Object.handleResp (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/common/src/util.js:131:18)
    at /user_code/node_modules/firebase-admin/node_modules/@google-cloud/common/src/util.js:496:12
    at Request.onResponse [as _callback] (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/common/node_modules/retry-request/index.js:198:7)
    at Request.self.callback (/user_code/node_modules/firebase-admin/node_modules/request/request.js:185:22)
    at emitTwo (events.js:106:13)
    at Request.emit (events.js:191:7)
    at Request.<anonymous> (/user_code/node_modules/firebase-admin/node_modules/request/request.js:1161:10)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
code: undefined,
errors: undefined,
response: undefined,
message: 'Error during request.' }

(старый вопрос удален)

1 Ответ

0 голосов
/ 19 ноября 2018

«Ошибка: невозможно установить заголовки после их отправки» означает, что вы попытались отправить два ответа клиенту. Это недействительно - вы можете отправить только один ответ.

Ваш код явно отправляет два ответа типа 200 клиенту в случае сбоя imageRef.delete () и запускается обратный вызов catch для него.

Кроме того, вы смешиваете ожидание с then / catch. Они не предназначены для совместного использования. Вы выбираете один или другой. Как правило, если вы используете await для асинхронного программирования, вы также не используете then / catch с тем же обещанием. Это более идиоматичное использование await с обработкой ошибок:

try {
    await imageRef.delete()
    res.status(200).send({status: 200, message: `Thank you for id ${id}`});
} catch (error) {
    res.status(500).send({message: `Image deletion failed: ${err}`});
}

Обратите внимание, что вы обычно отправляете клиенту 500 ответов при сбое, а не 200, что указывает на успех.

...