2

我开发了一个Firebase云端功能,可处理上传图片上的多个操作。 我的代码基于this documentation articlethis Cloud Function example。因此,它使用Google Cloud Storage packageFirebase存储和云端功能 - ECONNRESET

它做工精细,几乎所有的时间,但上载或从存储删除时,有时我得到这个错误:

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

我用我的应用程序的默认斗,由event.data.bucket引用。

让我知道你是否需要额外的信息或代码片断,即使我的代码非常接近之前链接的函数示例。

我发现this GitHub issue,但我检查了我每次都会返回一个承诺。例如,这里是触发错误的删除部分:

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

任何机会,我们可以看到'...'后面发生了什么? – Nivco

+0

您已将所有代码对应于缩略图删除。我的函数应该停止在'return bucket.file(gcsThumbnailFilePath).delete()。'部分。我在Firebase后端得到了以前的'console.log('缩略图删除:'+ gcsThumbnailFilePath);'但不是承诺成功完成之一。 – OlivierH

+0

我没有看到ECONNRESET实际发生的任何原因。这是否经常发生? – Nivco

回答

2

这似乎是关系到google-cloud-node图书馆处理套接字以及Cloud Functions环境中的默认套接字超时。

用户验证的一个解决方案是修改库调用requests的方式,以便通过指定forever: false(例如,

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

这是硬编码在packages/common/src/utils.js,所以你需要厂商修改库的副本到您的项目,而不是把它作为一个NPM的依赖。请参阅related public issue了解有关此问题的更多详细信息以及与patch applied分叉的链接。

+0

对不起,延迟接受你的回答,我之前没有看到它。 有关信息,如果您正在使用Google平台(我猜也是Firebase),它似乎在云功能环境中得到纠正。请参阅https://github.com/GoogleCloudPlatform/google-cloud-node/issues/2254#issuecomment-300201954 – OlivierH

相关问题