【发布时间】:2020-06-17 10:23:09
【问题描述】:
我遇到的问题是,当我针对 .zip 文件测试函数时,当函数到达 fs.createReadStream&Zip 时,函数没有运行或返回错误,我想了解什么我做错了,正确的解决方案看起来如何。
const AWS = require('aws-sdk');
const fs = require('fs');
const mkdirp = require('mkdirp');
const unzipper = require('unzipper');
exports.handler = async (event, context) => {
// Variables for bucket init
let sourceBucket = 'am-doc-mgmt-s3-dev-landing';
let storageBucket = 'am-doc-mgmt-s3-dev';
// Variables for folder init and Buffer config
const localZippedFolder = '/tmp/ZippedStudentData/';
const localUnzippedFolder = '/tmp/UnzippedStudentData/';
const ZipBuffer = Buffer.from(localZippedFolder, 'base64');
const UnzippedBuffer = Buffer.from(localUnzippedFolder, 'base64');
// Inits AWS s3 Bucket and DynamoDB
let s3 = new AWS.S3();
let docClient = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1' });
// Gets the file bucket and file name of the s3 object from context
let fileBucket = event.Records[0].s3.bucket.name;
let fileName = event.Records[0].s3.object.key;
let params = {
Bucket: fileBucket,
Key: fileName
};
// Creates temporary variables
let tempFile = localZippedFolder + fileBucket;
let tempUnzippedFile = localUnzippedFolder + fileBucket;
// Make Directories for Zipped and Unzipped files
try {
const zipDirFolder = await mkdirp(localZippedFolder, { recursive: true })
const unZipDirFolder = await mkdirp(localUnzippedFolder, { recursive: true });
console.log('SUCCESS: unzipped directory created!');
console.log('SUCCESS: zipped directory create!')
// Download files from s3 Bucket
let newFolder = await s3.getObject(params).promise()
.then(data => {
console.log(data);
return data;
});
// Extract files from zipped folder and store them in a local directory
fs.createReadStream(params.Key)
.pipe(unzipper.Extract({path: unZipDirFolder}))
.on('finish', () => {
fs.readdir(unZipDirFolder);
}).on('error', (err) => {
// error handling here
console.log(err);
});
}
catch (error) {
console.log(error);
}
};
错误:没有从 fs.createReadStream 函数返回任何内容。就好像它只是跳过了该功能。
【问题讨论】:
-
因此,您的结果将是
fs.readdir(unZipDirFolder);所在的位置。您需要在该事件处理程序内使用结果。你在这里期待什么?结果是异步检索的。使用这种结构,您可以使用它们的唯一位置就是您执行fs.readdir(unZipFolder)的地方(这也是异步的,因此您也必须适当地执行此操作)。 -
您希望如何调用和使用这个
async导出的函数?究竟是什么不工作? -
它跳过了
fs.createReadStream().pipe(),因为它都是异步的。当您收到finish事件时,它就完成了。同时,它继续运行其他东西。 -
好的,为了解决这个问题,我需要从当前位置删除 fs.readdir() 函数并在其位置返回结果?
-
不,从事件处理程序内部返回对您没有任何好处。这不会从您的主要功能返回。请参阅我在下面添加的承诺包装器(与我在您的其他问题中向您展示的概念相同)。
标签: javascript node.js asynchronous aws-lambda async-await