Node.js 写入S3(aws sdk nodeJS)是否与在bucket中列出对象冲突?

Node.js 写入S3(aws sdk nodeJS)是否与在bucket中列出对象冲突?,node.js,amazon-web-services,amazon-s3,Node.js,Amazon Web Services,Amazon S3,请记住,我最多只能被描述为node和AmazonS3的新手。我有一个可以在后台写入S3的应用程序。当文件被写入时,我想从S3中读取,并且只在写入之后读取。我尝试检查对象的数量并返回结果: function haveFilesBeenWrittenToBucket(bucketName, callback) { s3.listObjects({ Bucket: bucketName }, function(err, data) { const items = data.Contents;

请记住,我最多只能被描述为node和AmazonS3的新手。我有一个可以在后台写入S3的应用程序。当文件被写入时,我想从S3中读取,并且只在写入之后读取。我尝试检查对象的数量并返回结果:

function haveFilesBeenWrittenToBucket(bucketName, callback) {
s3.listObjects({ Bucket: bucketName }, function(err, data) {
    const items = data.Contents;
    callback(items);
});
}

以及readFile函数:

OSClient.prototype.readFile = function(params, callback) {
haveFilesBeenWrittenToBucket(params.Bucket, items => {
    console.log("Number of items " + items.length);
        if (items.length > 0) {
            const rl = readline.createInterface({
                input: s3.getObject(params).createReadStream()
            });
            const myArray = [];
            rl.on("line", function (line) {
                const lineArray = line.split(",");
                for (const value of lineArray) {
                    if (isNaN(value)) {
                        // line.split creates string elements, adding extraneous quotation marks in a string and converting
                        // number to string, so there is a need to reverse this process.
                        const slicedElement = value.slice(1, -1);
                        myArray.push(slicedElement);
                    } else {
                        const valueOfNumber = Number(value);
                        myArray.push(valueOfNumber);
                    }
                }
            })
                .on("close", function () {
                    callback(myArray);

                });
        }
         else{
                var myfunction = this.readFile.bind(this, params, callback);
                setTimeout(myfunction, 5000);
            }


    });
})

最后:

     targetClient.readFile(params, function (arrayResult) {
                            logger.info("Read file:" + fileName + OS_FILE_SUFFIX);
                            readArray = arrayResult;
                        });

如果我在回调(items)(在'havefilesbeenwritentobucket'中)上设置一个断点,那么一切都正常,我将返回写入bucket中的文件,但如果没有,似乎没有任何内容写入S3。看起来像是一些比赛条件,但我真的很无知,我真的很感谢你的帮助。列出对象和写入S3之间是否存在冲突(至少要等到很久以后,在其他一些测试中,不应该发生冲突时才会发生冲突(它是mocha测试套件的一部分-readFile在async.瀑布中)。我已经在这上面呆了好几天,但什么也没得到。正如我所说,这是我第一次接触node,所以请耐心等待。谢谢。

S3在阅读后为列表提供了最终的一致性。因此,您可能会注意以下几点:

进程将一个新对象写入AmazonS3,并立即列出其bucket中的键。在完全传播更改之前,该对象可能不会出现在列表中

S3提供即时一致性的唯一情况是在写入新对象的PUT后读取(附带一个小警告,有文档记录)。 更多详情请访问

下面是一个示例,说明如何使用等待对象,然后检索其内容(本例中假定为文本)


S3提供了读取后列表的最终一致性。因此,您可能会注意以下几点:

进程将一个新对象写入AmazonS3,并立即列出其bucket中的键。在完全传播更改之前,该对象可能不会出现在列表中

S3提供即时一致性的唯一情况是在写入新对象的PUT后读取(附带一个小警告,有文档记录)。 更多详情请访问

下面是一个示例,说明如何使用等待对象,然后检索其内容(本例中假定为文本)


两件事。首先,我发现我的问题与nodeJS无关。唉 其次,API现在提供了一个“waitFor”方法,用于轮询bucket或对象是否存在:


两件事。首先,我的问题与nodeJS无关。唉 其次,API现在提供了一个“waitFor”方法,用于轮询bucket或对象是否存在:


谢谢。我在这里真的是新手。我需要列出bucket中的对象,以检查是否至少有1个,然后立即读取文件。我不知道文件将在何时写入,因此可能是它在列出对象时尝试写入。有什么建议吗?它在我上面提到的位置使用断点,但不是在什么时候n我直接运行代码真正的问题是如何工作才能获得预期的行为。在某个未指定的时间写入S3,然后在bucket中列出一个对象列表,该列表将可靠地返回添加的对象。如果我列出bucket中的对象,然后在再次列出它们之前等待一定时间,会不会有帮助吗?如果有,我该怎么做?谢谢如果你知道该对象将存在,那么也许你可以在延迟后发出getObject请求(一秒钟可能就足够了),但要做好失败的准备,在这种情况下,你应该实现一些指数延迟并重试(例如,在12、4、8秒后重试getObject)直到您成功或尝试了太多次之后,操作才会失败。在JavaScript中,您可以使用setTimeout()。顺便说一句,AWS有一个名为Lambda的“无服务器”服务,允许您在某些事件发生时执行代码,例如文件存储在S3中。不确定您的应用程序的功能,因此这可能不是一个很好的选择,但这可能是一个值得研究的选项,因为您不必担心列出S3对象并等待它们出现。您可以st通过与S3一致性的链接救了我的命!谢谢你。我在这里真的是个新手。我需要列出桶中的对象以检查是否至少有1个,然后立即读取该文件。我不知道该文件将在何时写入,所以可能是它在列出对象时尝试写入。有什么建议吗?它与断点位于我上面提到的位置,但不是在我直接运行代码时。真正的问题是我如何处理它,以便获得预期的行为。在某个未指定的时间写入S3,然后在bucket中列出一个对象列表,该列表将可靠地返回添加的对象。如果我列出bucket中的对象,然后等待一个证书在再次列出它们之前的一段时间内,这会有帮助吗?如果有,我该怎么做?谢谢如果您知道对象将存在,那么也许您可以在延迟后发出getObject请求(一秒钟可能就足够了),但要做好失败的准备,在这种情况下,您应该实现一些指数延迟并重试(例如,在12、4、8秒后重试getObject),直到成功或尝试次数过多,否则操作将失败。在JavaScript中,可以使用setTimeout()。顺便说一句,AWS有一个名为Lambda的“无服务器”服务,允许您在某些事件发生时执行代码,例如文件存储在S3中。不确定您的应用程序的功能,因此这可能不是一个很好的选择,但这可能是一个值得研究的选项,因为您不必担心列出S3对象并等待它们出现。您可以st用S3一致性的链接救了我的命!谢谢你用S3一致性的链接救了我的命!你用S3一致性的链接救了我的命!
var aws = require("aws-sdk");
var async = require("async");

var s3 = new aws.S3();
var bucket = 'mybucket';
var iteration = 0;

function waitForObjects(bucket, callback) {
    console.error(`Iteration: ${++iteration}`);

    s3.listObjects({Bucket:bucket}, function(err, data) {
        if (err) {
            callback(err);
        } else if (!data.Contents || !data.Contents.length) {
            callback(new Error("No objects"))
        } else {
            callback(null, data);
        }
    });
}

// Try calling waitForObjects 10 times with exponential backoff
// (intervals of 100, 200, 400, 800, 1600, ... milliseconds)
async.retry({
    times: 10,
    interval: function(retryCount) {
        return 50 * Math.pow(2, retryCount);
    }
}, async.apply(waitForObjects, bucket), function(err, data) {
    if (err) {
        console.error(`Error waitForObjects: ${err}`);
    } else {
        console.log(`Object count: ${data.Contents.length}`);

        data.Contents.forEach(function(item, index) {
            console.log(`Object ${index+1} key: ${item.Key}`);

            s3.getObject({Bucket:bucket, Key:item.Key}, function(err, data) {
                console.log(`Object ${index+1} txt: ${data.Body.toString()}`);
            });
        });
    }
});