【问题标题】:Google Cloud Function - Storage - Delete Image - "ApiError: Error during request"谷歌云功能 - 存储 - 删除图像 - “ApiError:请求期间出错”
【发布时间】:2018-11-19 16:41:56
【问题描述】:

更新问题

问题是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.' }

(旧问题已删除)

【问题讨论】:

    标签: node.js firebase google-cloud-storage google-cloud-functions


    【解决方案1】:

    “Error: Can't set headers after they are sent”表示您尝试向客户端发送两个响应。这是无效的 - 您只能发送一个响应。

    如果 imageRef.delete() 失败并触发其上的 catch 回调,您的代码显然会向客户端发送两个 200 类型响应。

    另外,您将 await 与 then/catch 混淆了。它们不应该一起使用。你选择一个或另一个。通常,如果您将 await 用于异步编程,则不要将 then/catch 与相同的 Promise 一起使用。这是带有错误处理的 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。

    【讨论】:

    • 您好,Doug,感谢您的回复。这绝对是对我的代码进行的一些很好的改进,但是,主要错误仍然没有解决方案:"ApiError: Error during request" 这背后有什么想法吗?
    • 那么我建议用单个文件中最短的代码来重新构建您的问题,以说明问题,这样其他问题就不会被混为一谈,我们不会不必相信确实存在缺失代码。
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2017-08-20
    • 2021-08-20
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多