2017-04-02 72 views
0

我有上火力數據庫觸發器onWrite的功能。函數體使用兩個谷歌雲端API(DNS和存儲)。ECONRESET插座hungup

雖然功能正在運行,如預期(主要是)工作,問題是,插座往往比我想掛斷電話。 (倍50%〜)

我的問題是: 它是類似於測試人員的其餘部分都經歷過?這是一個衆所周知的問題,是突出的還是預期的行爲?

示例代碼如下:

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
const {credentials} = functions.config().auth; 
credentials.private_key = credentials.private_key.replace(/\\n/g, '\n'); 
const config = Object.assign({}, functions.config().firebase, {credentials}); 
admin.initializeApp(config); 
const gcs = require('@google-cloud/storage')({credentials}); 
const dns = require('@google-cloud/dns')({credentials}); 
const zoneName = 'applambda'; 
const zone = dns.zone(zoneName); 

exports.createDeleteDNSAndStorage = functions.database.ref('/apps/{uid}/{appid}/name') 
.onWrite(event => { 
    // Only edit data when it is first created. 
    const {uid, appid} = event.params; 
    const name = event.data.val(); 
    const dbRef = admin.database().ref(`/apps/${uid}/${appid}`); 

    if (event.data.previous.exists()) { 
     console.log(`already exists ${uid}/${appid}`); 
     return; 
    } 
    // Exit when the data is deleted. 
    if (!event.data.exists()) { 
     console.log(`data is being deleted ${uid}/${appid}`); 
     return; 
    } 

    const url = `${name}.${zoneName}.com`; 
    console.log(`data: ${uid}/${appid}/${name}\nsetting up: ${url}`); 

    setupDNS({url, dbRef}); 
    setupStorage({url, dbRef}); 
    return; 
}); 

function setupDNS({url, dbRef}) { 

    // Create an NS record. 
    let cnameRecord = zone.record('cname', { 
     name: `${url}.`, 
     data: 'c.storage.googleapis.com.', 
     ttl: 3000 
    }); 

    zone.addRecords(cnameRecord).then(function() { 
     console.log(`done setting up zonerecord for ${url}`); 
     dbRef.update({dns: url}).then(res => console.log(res)).catch(err => console.log(err)); 
    }).catch(function(err) { 
     console.error(`error setting up zonerecord for ${url}`); 
     console.error(err); 
    }); 
} 

function setupStorage({url, dbRef}) { 
    console.log(`setting up storage bucket for ${url}`); 

    gcs.createBucket(url, { 
     website: { 
      mainPageSuffix: `https://${url}`, 
      notFoundPage: `https://${url}/404.html` 
     } 
    }).then(function(res) { 
     let bucket = res[0]; 
     console.log(`created bucket ${url}, setting it as public`); 
     dbRef.update({storage: url}).then(function() { 
      console.log(`done setting up bucket for ${url}`); 
     }).catch(function(err) { 
      console.error(`db update for storage failed ${url}`); 
      console.error(err); 
     }); 
     bucket.makePublic().then(function() { 
      console.log(`bucket set as public for ${url}`); 
     }).catch(function(err) { 
      console.error(`setting public for storage failed ${url}`); 
      console.error(err); 
     }); 
    }).catch(function(err) { 
     console.error(`creating bucket failed ${url}`); 
     console.error(err); 
    }); 
} 
+0

另請參閱:http://stackoverflow.com/questions/43058274/google-cloud-functions-with-econnreset-errors-until-i-redeploy/43149553#43149553 – Paul

回答

0

我想你的函數需要返回一個承諾,讓所有其他異步工作,有時間來完成的功能關閉之前。因爲它是現在所示,你的函數簡單地立即返回,而無需等待工作完成。

我不知道你使用的雲API非常好,但我猜你應該讓你的setupDns()setupStorage()返回他們正在做的異步工作的承諾,然後返回Promise.all()通過那些2個承諾讓雲功能知道應該等到所有的工作是清理是正在運行的功能容器之前完成。

+0

我意識到在發佈問題後。然而,隨機重置還是發生了,也許不是經常,雖然我沒有辦法判斷,如果頻率有所減少。我會嘗試一下保羅在他的評論中提出的建議,並回復它是否修復 –