2

Ich habe eine Firebase Cloud-Funktion entwickelt, die mehrere Manipulationen an hochgeladenen Bildern verarbeitet. Mein Code basiert auf this documentation article und this Cloud Function example. Daher verwendet es Google Cloud Storage package.Firebase Storage- und Cloud-Funktionen - ECONNRESET

Es funktioniert gut fast die ganze Zeit, aber manchmal bin ich diesen Fehler beim Hochladen oder Lagerung zu löschen:

Error: read ECONNRESET 
    at exports._errnoException (util.js:1026:11) 
    at TLSWrap.onread (net.js:569:26) 

ich die Standard-Eimer meiner Anwendung verwende, von event.data.bucket verwiesen.

Lassen Sie mich wissen, wenn Sie zusätzliche Informationen oder Code-Schnipsel benötigen, auch wenn mein Code dem vorher verlinkten Funktionsbeispiel sehr ähnlich ist.

Ich habe this GitHub issue gefunden, aber ich habe überprüft, dass ich jedes Mal ein Versprechen zurückgebe. Zum Beispiel, hier ist das Löschen Teil, der den Fehler auslöst:

index.js

exports.exampleFunction = functions.storage.object().onChange(event => { 
    return f_thumbnails.exampleFunction(event); 
}); 

example_function.js

module.exports = exports = function (_admin, _config) { 
    admin = _admin; 
    config = _config; 

    return { 
     "exampleFunction": function (event) { 
      return exampleFunction(event); 
     } 
    }; 
}; 

const exampleFunction = function (event) { 
    const gcsSourceFilePath = event.data.name; 
    const gcsSourceFilePathSplit = gcsSourceFilePath.split('/'); 
    const gcsBaseFolder = gcsSourceFilePathSplit.length > 0 ? gcsSourceFilePathSplit[0] : ''; 
    const gcsSourceFileName = gcsSourceFilePathSplit.pop(); 
    const gceSourceFileDir = gcsSourceFilePathSplit.join('/') + (gcsSourceFilePathSplit.length > 0 ? '/' : ''); 

    // Not an image 
    if (!event.data.contentType.startsWith('image/')) { 
     console.log('Not an image !'); 
     return; 
    } 

    // Thumbnail 
    if (gcsSourceFileName.startsWith(config.IMAGES_THUMBNAIL_PREFIX)) { 
     console.log('Thumbnail !'); 
     return; 
    } 

    const bucket = gcs.bucket(event.data.bucket); 
    const gcsThumbnailFilePath = gceSourceFileDir + config.IMAGES_THUMBNAIL_PREFIX + gcsSourceFileName; 


    // File deletion 
    if (event.data.resourceState === 'not_exists') { 
     console.log('Thumbnail deletion : ' + gcsThumbnailFilePath); 
     return bucket.file(gcsThumbnailFilePath).delete().then(() => { 
      console.log('Deleted thumbnail ' + gcsThumbnailFilePath); 
     }); 
    } 
    ... 
+0

Jede Chance, wir können sehen, was nach dem '...' passiert? – Nivco

+0

Sie haben den gesamten Code, der einem Löschen von Miniaturansichten entspricht. Meine Funktion sollte bei 'return bucket.file (gcsThumbnailFilePath) .delete().' Part stehen bleiben. Ich bekomme die vorherige 'console.log ('Thumbnail-Löschung:' + gcsThumbnailFilePath);' im Firebase-Backend, aber nicht die Versprechung des Erfolgsabschlusses. – OlivierH

+0

Ich sehe keine Gründe, warum ein ECONNRESET tatsächlich passieren würde. Kommt das häufig vor? – Nivco

Antwort

2

Dies ist auf die google-cloud-node Bibliothek verwandt zu sein scheint Umgang mit Sockets und das Standard-Socket-Timeout in der Cloud-Funktionen-Umgebung.

Eine von einem Benutzer verifizierte Lösung besteht darin, die Art zu ändern, in der die Bibliothek requests aufruft, um den Socket nicht für immer offen zu halten, indem forever: false angegeben wird, z.

var request = require('request').defaults({ 
    timeout: 60000, 
    gzip: true, 
    forever: false, 
    pool: { 
    maxSockets: Infinity 
    } 
}); 

Dies ist fest einprogrammiert in packages/common/src/utils.js, so dass Sie eher eine Kopie der modifizierten Bibliothek in Ihr Projekt Hersteller benötigen, als sie als NPM Abhängigkeit enthalten. Weitere Informationen zu diesem Problem finden Sie unter related public issue und ein Link zu einer Gabel mit der patch applied.

+0

Sorry für die Verzögerung, um Ihre Antwort zu akzeptieren, ich habe es vorher nicht gesehen. Für Informationen scheint es in Cloud-Funktionen-Umgebungen korrigiert werden, wenn Sie Google-Plattformen verwenden (Firebase auch ich denke). Siehe https://github.com/GoogleCloudPlatform/google-cloud-node/issues/2254#issuecomment-300201954 – OlivierH