提问者:小点点

当尝试在functions firebase中获取图像链接时,promise返回未定义


我试图从一个firebase函数获得响应的值,但是它只返回我作为未定义的,我在一些文章中看到身体解析器不再工作了,我怀疑问题出在我的函数中,但是我没有得到它找到问题,这是我的函数代码,图像图像是salve但是不返回‘图像URL’保存在数据库中

    exports.uploadImage = functions.https.onRequest((request, response) => {
    cors(request, response, () =>{
        try{
            fs.writeFileSync('tmp/imageToSave.jpg',
             request.body.image, 'base64')
            const bucket = storage.bucket('cloneinstagram-b46a9.appspot.com')
            const id = uuid()
            bucket.upload('tmp/imageToSave.jpg',{
                uploadType: 'media',
                destination: `posts/${id}.jpg`,
                metadata:{
                    metadata:{
                        contentType: 'image/jpeg',
                        firebaseStorageDownloadTokens:id
                    }
                }
            },( err, file) => {
                if(err){
                  console.log(err);
                    return response.status(500).json({error: err});
                }else{
                    const fileName = encodeURIComponent(file.name);
                    const imageUrl = 'https://firabasestorage.googleapis.com/v0/b/'+ bucket.name + '/o/' + fileName + '?alt=media&token=' + id;
                    return response.status(201).json({imageUrl: imageUrl})
                }
            }
        )
        }catch(err){
            console.log(err)
            return response.status(500).json({error:err})
        }
    })
 });

这是我的手机代码

      axios({
            url: 'uploadImage',
            baseURL: 'https://us-central1-cloneinstagram-b46a9.cloudfunctions.net/',
            method: 'post',
            data:{
                image: posts.image.base64
            }
        })
            .catch(err => console.log('erro', err))
            .then(resp => { 
                posts.image = resp.data.image;
                console.log(' teste image',posts.image)
                axios.post('posts.json', {...posts})
                .catch(err => console.log('teste image', err))
                .then(res => console.log('teste imagem', (res.data.image))) 
            }) 
        }


共1个答案

匿名用户

正如Cloud Functions文档中所解释的,您需要通过返回JavaScript承诺来处理异步处理。

因此,在您的示例中,需要使用upload()异步方法的“承诺版本”,而不是“回调版本”。

如此方法的文档所述(参见示例):

如果省略回调,(该方法将)返回一个承诺。

因此,下面的方法应该可以解决这个问题:

exports.uploadImage = functions.https.onRequest((request, response) => {
    cors(request, response, () => {

        fs.writeFileSync('tmp/imageToSave.jpg', request.body.image, 'base64')
        const bucket = storage.bucket('cloneinstagram-b46a9.appspot.com')
        const id = uuid()

        bucket.upload('tmp/imageToSave.jpg', {
            uploadType: 'media',
            destination: `posts/${id}.jpg`,
            metadata: {
                metadata: {
                    contentType: 'image/jpeg',
                    firebaseStorageDownloadTokens: id
                }
            }
        })
            .then(uploadTaskSnapshot => {
                const fileName = encodeURIComponent(file.name);
                const imageUrl = 'https://firabasestorage.googleapis.com/v0/b/' + bucket.name + '/o/' + fileName + '?alt=media&token=' + id;
                return response.status(201).json({ imageUrl: imageUrl })
            })
            .catch(err => {
                console.log(err)
                return response.status(500).json({ error: err })
            })
    });

});

关于在云函数中为什么需要通过返回承诺来处理异步处理的更多细节,我建议您观看Firebase视频系列中关于“JavaScript承诺”的三个视频:https://Firebase.google.com/docs/Functions/video-series/