我正試圖將多個檔案上傳到 Google 云存盤。我正在使用一個 for 回圈來處理我想要上傳的檔案串列中的每個檔案。
然而,問題是for回圈在進入下一個上傳之前并沒有暫停,以等待上傳的完成。它最終上傳了這些檔案,但是 for 回圈提前結束,然后將空的 urlList 送回給客戶端。
我如何讓它暫停并等待每個上傳程序,然后再進入for回圈的下一個檔案?
const processFile = require('./middleware'>)。
const { format } = require('util')。
let uuidv4 = require('uuid/v4'/span>)。
const Cloud = require('@google-cloud/storage')。
const { Storage } = Cloud;
const storage = new Storage({
keyFilename: './xxx.json'。
projectId: 'xxx'.
});
const bucket = storage.bucket('xxx')。
exports.upload = async(req, res)=> {
const urlList = [];
await processFile(req, res); /molter
for (var i = 0; i < req.files.length; i ) {
if (! req.files[i]) {
return res.status(400).send({ message: 'Please upload a file!' })。)
}
const { originalname, buffer } = req.files[i];
var filename = originalname
.toLowerCase()
.split(' '/span>)
.join('-') 。
filename = uuidv4() '-'/span> filename。
console.log(filename)。
const blob = bucket.file(filename)。
const blobStream = blob.createWriteStream( {
resumable: false.
});
blobStream.on('error', err => {
res.status(500).send({ message: err.message })。
});
blobStream.on('finish', async data => {
const publicUrl = format(
`https://storage.googleapis.com/${bucket.name}/${blob.name}`
);
urlList.push(publicUrl)。
try {
await bucket.file(filename).makePublic() 。
} catch (err) {
console.log(' failed to make it public'/span>)。
reject(err)。
}
});
blobStream.end(buffer)。
}
return res.status(200).send({
message: 'Uploaded the files successfully',
url: urlList
});
};
uj5u.com熱心網友回復:
只要把你的 "上傳 "代碼放在一個Promise中,你可以在回圈中await。另外,通過使用on,它里面的代碼將不跟隨for回圈。通過使用這種基于事件的代碼,你的for回圈將只是穿過它而不能等待它完成。這應該可以解決這個問題:
const uploadFile=(f)=> {
return new Promise((resolve, reject) => /span> {
const { originalname, buffer } = f;
var filename = originalname.toLowerCase(). split(" ").join("-") 。
filename = uuidv4() "-"/span> filename。
console.log(filename)。
const blob = bucket.file(filename)。
const blobStream = blob.createWriteStream( {
resumable: false,
});
blobStream.on("error", (err) => /span> {
res.status(500).send({ message: err.message }) 。
reject(err)。
});
blobStream.on("finish", async(data)=> {
const publicUrl = format(
`https://storage.googleapis.com/${bucket.name}/${blob.name}`
);
try {
await bucket.file(filename).makePublic()。
resolve(publicUrl)。
} catch (err) {
console.log(" failed to make it public") 。
reject(err)。
}
});
blobStream.end(buffer)。
});
};
exports.upload = async(req, res)=> {
const urlList = [];
await processFile(req, res); /molter
for (var i = 0; i < req.files.length; i ) {
if (! req.files[i]) {
return res.status(400).send({ message: "請上傳檔案!" })。)
}
const publicUrl = await uploadFile(req.files[i])。
urlList.push(publicUrl)。
}
return res.status(200).send({
message: "Uploaded the files successfully",
url: urlList,
});
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/312351.html
標籤:
