【发布时间】:2021-05-21 00:43:34
【问题描述】:
我知道很多话题都是关于承诺和回调的。我尝试了很多方法,但还是没有成功。
我想要的是在本地编辑文件,保存然后上传到 S3。然后调用另一个函数从文件中读取并显示为列表
不幸的是,我遇到了错误,因为文件正在结束调用另一个函数来显示以读取,然后它正在 S3 中写入和保存,正如您在我的 [终端][1] 中看到的那样 该文件已正确编辑并上传到 s3
1- 我尝试使用 then 作为承诺一个接一个地执行
static async edit_product(req: any, res: any) {
console.log('edit_product param request',req.body)
try {
ExcelFile.EditFile(prod.product_code,prod.product_name).then(rs=> res.status(200).json({'success'}) ) ).catch((err) => {
console.error(err);
})
console.log('test')
}
2- 使用 await 然后
static async edit_product(req: any, res: any) {
console.log('edit_product param request',req.body)
try {
await ExcelFile.EditFile(prod.product_code,prod.product_name).then(rs=> rs)
console.log('test')
res.status(200).json({'success product edit':prod.product_code})
}
3-上传文件到S3
static async UploadFileS3() {
const file = config._path+config._foldername +config._filename
var s3 = new aws.S3({ accessKeyId: config._ACCESS_KEY_ID,secretAccessKey: config._SECRET_ACCESS_KEY });
var newversionId: string = ''
const params = {
Bucket: config._BUCKET_NAME,
Key: config._filename // File name you want to save as in S3
};
return s3.putObject(params, function(err, data) {
if (err) {console.log(err) }
newversionId = data.VersionId!
console.log("Successfully uploaded data ",newversionId);
});
};
4-编辑文件
const stream = new Stream.PassThrough();
var dataFile = wb.xlsx.readFile(file).then(rs=>{
var sh = rs.getWorksheet(config._sheetname);
for (let i = 2; i <= sh.rowCount; i++) {
let currRow = sh.getRow(i);
if (currRow.getCell(1).text==product_code){
currRow.getCell(2).value = product_name
currRow.commit();
break } }
console.log('edit ')
//save locally
wb.xlsx.writeFile(file).then(rs=>{console.log('edit filed successfully')});
const param = {Key: config._filename,
Bucket: config._BUCKET_NAME,
Body: stream,
ContentType: 'CONTENT_TYPE_EXCEL'
}
//save to s3
wb.xlsx.write(stream).then(() => {s3.upload(param, function (err,data) {
if (err) { console.log("Error", err); }
console.log("Upload Success", data.ETag);
ExcelFile.getAwsVersion().then(rs=>ExcelFile.saveFileBucketVersion(rs))
})
})
})
return dataFile //return promise
我怎样才能让它尊重步骤,先编辑然后返回 res.status(200).json({'success'} [1]:https://i.stack.imgur.com/SsWhu.png
【问题讨论】:
-
由于
s3.putObject()接受一个nodeback,它似乎不太可能也返回Promise。如果是这样,那么UploadFileS3()返回的内容不会被await或.then()语法等待。
标签: async-await promise callback aws-sdk exceljs