首页 > 解决方案 > 在模拟的 Firebase 函数中运行 admin.storage().bucket(..).file(..).move() 时出现未实现的 API 错误

问题描述

“firebase”:“9.0.1”-本地“firebase-tools”:9.17.0-全局“节点”:v14.17.4

.move()在模拟函数中使用 Firebase 管理 SDK 调用。Firebase 返回以下错误:

ApiError: file#copy failed with an error - Not Implemented
at new ApiError (.../functions/node_modules/@google-cloud/common/build/src/util.js:73:15)
statusCode: 501
request: {
              agent: [Agent],
              headers: [Object],
              href: 'http://localhost:9199/b/public-8s9ch/o/91ff38b1-b521-4a23-8844-b12cffa0ee98%2Fscreenshot.png/rewriteTo/b/private-8s9ch/o/91ff38b1-b521-4a23-8844-b12cffa0ee98%2Fcd665e29-edc8-4832-9bc7-110c21f1e560?'
            },
            body: 'Not Implemented',

完全相同的代码,具有相同的测试和安装的软件包,在部署到 Firebase 时可以完美运行,而不是在模拟器中使用。.copy无论使用 Admin SDK 还是使用客户端 SDK(例如、.move.delete等) ,对存储 API 的任何调用都会出现同样的问题。

这是一些有助于重现错误的代码:

export const firebaseFunction = functions
.runWith({ memory: "128MB" })
.region("us-central1")
.firestore.document("documents/{docId}")
.onCreate(async (snap, context) => {
    try {
    const { srcId } = snap.data();

    const [files] = await admin
        .storage()
        .bucket('public')
        .getFiles({
        prefix: `${srcId}/`,
        delimiter: "/",
        autoPaginate: false,
        });

    const promises = files.map((file) => {
        return new Promise<void>(async (resolve, reject) => {
        try {
            const dst = admin
            .storage()
            .bucket('private')
            .file(`${srcId}/${uuidv4()}`);
            await file.move(dst);
            resolve();
        } catch (err) {
            reject(err);
        }
        });
    });

    await Promise.all(promises);

    } catch (error) {
    return console.log(error);
    }
});

标签: firebasegoogle-cloud-storage

解决方案


推荐阅读