gpt4 book ai didi

node.js - 通过 file.createWriteStream() 流式传输到 GCP 时,获取 ESOCKETTIMEOUT、ECONNRESET 或套接字挂起大文件

转载 作者:IT老高 更新时间:2023-10-28 23:01:41 25 4
gpt4 key购买 nike

在尝试通过 Google Cloud Function 将大文件 (>50MB) 上传到 Google Cloud Storage 时,我遇到了这些异常,具体取决于我设置的选项:

  • 在设置请求选项“永远:假”时,我得到:错误:套接字挂断
  • 在设置请求选项“可恢复:真”时,我得到:错误:写入 ECONNRESET
  • 在设置请求选项'resumable: false'时,我得到:错误:ESOCKETTIMEDOUT with resumable: false

这是我使用的代码:

function uploadFile(bucketName, filename, data) {
console.log("Starting uploading blob...");
const Storage = require('@google-cloud/storage');

console.log("Creating client...");
const storage = new Storage();
storage.interceptors.push({
request: function(reqOpts) {
reqOpts.forever = false;
return reqOpts
}
});

console.log("Getting bucket " + bucketName + "...");
const bucket = storage.bucket(bucketName);
console.log("Creating file " + filename + "...");
const file = bucket.file(filename);
console.log("Creating write stream...");

var writeStream = file.createWriteStream({
metadata: {
contentType: 'plain/text'
},
resumable: false
});

writeStream.on('error', function(e) { console.error("An error occurred : " + e); });
writeStream.on('finish', function() { console.log("Success"); });

console.log("Initializing Streaming...");
var bufferStream = new stream.PassThrough();
bufferStream.end(data);
bufferStream.pipe(writeStream);
}

我有什么遗漏吗?

最佳答案

我通过使用库“request”(2.83.0)而不是“request-promise”解决了他的问题。这是我使用的简化代码:

const request = require('request').defaults({
timeout: 500000,
gzip: true,
forever: false,
pool: {
maxSockets: Infinity
}
});
const Storage = require('@google-cloud/storage');
const storage = new Storage();
storage.interceptors.push({
request: function(reqOpts) {
reqOpts.forever = false;
return reqOpts
}
});

/**
* HTTP Cloud Function.
*
* @param {Object} req Cloud Function request context.
* @param {Object} res Cloud Function response context.
*/
exports.exportToGCS = function exportToGCS(req, res) {
var bucket = req.body.bucket;
var fileName = req.body.fileName;

try {
console.log("Getting bucket " + bucket + "...");
var bucket = storage.bucket(bucket);
console.log("Creating file " + fileName + "...");
const file = bucket.file(fileName);
console.log("Creating writeStream...");
var writeStream = createWriteStream(file);
// Get the stream from a request to send out to GCS
var options = createRequest();
request
.get(options)
.pipe(writeStream);
console.log("Streaming to Storage...");
res.send("The export has been successfully initialized");
} catch (e) {
console.error(e.message, e.name);
res.status(500).send("An error occurred during the export initialization");
}
};

// Initialize the PDF write stream
function createWriteStream(file) {
var writeStream = file.createWriteStream({
metadata: {
//metadata you want to set
}
});
writeStream .on('error', function(e) { console.error("An error occurred : " + e); });
writeStream .on('finish', function() { console.log("Export completed"); });
return writeStream ;
}

希望对你有帮助!

关于node.js - 通过 file.createWriteStream() 流式传输到 GCP 时,获取 ESOCKETTIMEOUT、ECONNRESET 或套接字挂起大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47328578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com