首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在尝试将文件上传到Google存储时的承诺优先级

在尝试将文件上传到Google存储时的承诺优先级
EN

Stack Overflow用户
提问于 2018-06-08 04:18:17
回答 1查看 342关注 0票数 0

我正在上传一个文件到Google Cloud。完成后,我希望返回文件URL和一些元数据。我试着这样做:

代码语言:javascript
复制
blobStream.on('finish', () => {

                var fileSize;
                var fileCreated;

                fileUpload.getMetadata()
                    .then(metadata => { 
                        const mObj = metadata[0];
                        fileSize = mObj.size;
                        fileCreated = mObj.timeCreated;
                });

                fileUpload.getSignedUrl({
                    action: 'read',
                    expires: '03-09-2491'
                }).then(signedUrl => {
                    let response = {};
                        response.name = newFileName;
                        response.size = fileSize;
                        response.created = fileCreated;
                        response.url = signedUrl[0];
                    resolve(response);
                }).catch(error => {
                    reject(error);  
                });

            });

问题是,getSignedUrl方法总是首先触发,"fileSize“+ "fileCreated”永远不会被填充。

我认为我需要链接事件,这样getMetadata才会首先发生,但我对Node (和Promises)相对较新,可以使用一些建议。

根据BERGI的回复编辑的:(以下方法有效)

代码语言:javascript
复制
uploadFileToStorage(file) {

    let utils = new Utils();
    let newFileName = `${utils._guid()}-${Date.now()}`;
    let bucket = admin.storage().bucket();
    let filePath = url.format('audioFiles/' + newFileName);
    let fileUpload = bucket.file(filePath);

    let prom = new Promise(function(resolve, reject) {

        if (!file) {
            reject('No file provided');
            return;
        }

        const blobStream = fileUpload.createWriteStream({
            metadata: {
                contentType: file.mimetype
            }
        });

        blobStream.on('error', (error) => {
            reject('Something is wrong! Unable to upload at the moment.');
            return;
         });

        blobStream.on('finish', resolve);

        blobStream.end(file.buffer);

      }).then(() => { 

        return Promise.all([
            fileUpload.getMetadata(),
            fileUpload.getSignedUrl({
                action: 'read',
                expires: '03-09-2491'
            }),
        ]);

    }).then(([metadata, signedUrl]) => {

        const fileSize = metadata[0].size;
        const fileCreated = metadata[0].timeCreated;
        const response = {
            name: newFileName,
            size: fileSize,
            created: fileCreated,
            url: signedUrl[0],
        };

        return response;

    });

    return prom;

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 05:39:23

不要创建两个独立的promises,也不要使用你永远不知道什么时候会被赋值的外部作用域变量。相反,使用Promise.all来等待多个承诺:

代码语言:javascript
复制
new Promise(resolve => {
    blobStream.on('finish', resolve);
}).then(() => {
    return Promise.all([
        fileUpload.getMetadata(),
        fileUpload.getSignedUrl({
            action: 'read',
            expires: '03-09-2491'
        }),
    ]);
}).then(([metadata, signedUrl]) => {
    const fileSize = metadata[0].size;
    const fileCreated = metadata[0].timeCreated;
    const response = {
        name: newFileName,
        size: fileSize,
        created: fileCreated,
        url: signedUrl[0],
    });
    return response;
});

也要避免使用using further promises inside the Promise constructor

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50749581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档