2016-03-20 93 views
0

我正在嘗試返回getsignedurl裏面的url。當我嘗試這爲url1未定義如何在函數內部返回一個函數javascript/nodejs?

function getPublicUrl(filename) { 
      var url1; 
      var file = bucket.file(filename); 

      file.getSignedUrl({ 
       action: 'read', 
       expires: '03-17-2025' 

      }, function (err, url) { 
       if (err) { 
        console.error(err); 
        return; 
       } else { 
       url1 = url 
        console.log(url); 

       } 

      }); 
     return url1; 
} 

然後在另一個函數,我會叫getpublicurl

stream.on('finish', function() { 
      req.file.cloudStorageObject = gcsname; 
      req.file.cloudStoragePublicUrl = getPublicUrl(gcsname); 
+0

它看起來像'file.getSignedUrl'是異步的,所以'return url1;'在回調函數中設置了'url1'之前運行。 – forgivenson

回答

1

file.getSignedUrl似乎是一個異步功能,您可以在getPublicUrl使用ES6 Promise,某種程度上像這樣

function getPublicUrl(filename) { 
    return new Promise(function(resolve, reject) { 
    var file = bucket.file(filename); 
    file.getSignedUrl({ 
     action: 'read', 
     expires: '03-17-2025' 
    }, function(err, url) { 
     if (err) { 
     reject(err); 
     } else { 
     resolve(url); 
     } 

    }); 
    }); 
} 

stream.on('finish', function() { 
    getPublicUrl(gcsname).then(function(url) { 
    console.log(url); 
    req.file.cloudStorageObject = gcsname; 
    req.file.cloudStoragePublicUrl = url; 
    }).catch(function(err) { 
    console.log(err); 
    }); 
}); 
相關問題