【发布时间】:2021-08-21 13:34:24
【问题描述】:
我正在尝试通过 express/node 将从前端 formData 发送的三张帖子图片上传到 Firebase 存储。我希望该函数返回一个对象数组,每个对象都有图像名称和 publicUrl,然后我可以将它们保存在 Firestore 中相应的 Post doc 中。
下面当前代码的问题是它返回一个空数组[]。 urls.push() 方法中的日志虽然显示了正确的数组,但我只是不知道如何从以下 .then() 方法访问它。
感谢您的帮助!
router.post(
"/",
auth,
uploader.fields([
{ name: "cardImage", maxCount: 1 },
{ name: "postImageOne", maxCount: 1 },
{ name: "postImageTwo", maxCount: 1 },
]),
async (req, res, next) => {
try {
const { title, caption, content } = req.body;
const { uid } = req.user;
//add images to storage
const imagesWriteFunction = async () => {
var urls = [];
for (const [key, value] of Object.entries(req.files)) {
console.log(`---Starting upload process for ${key}---`);
const blob = bucket.file(`${value[0].originalname}`);
const blobWriter = blob.createWriteStream({
metadata: {
contentType: value[0].mimetype,
},
});
blobWriter.on("error", (err) => next(err));
blobWriter.on("finish", () => {
console.log("---Assemblying Public URL---", blob.name);
const publicUrl = `https://firebasestorage.googleapis.com/v0/b/${
bucket.name
}/ImagePosts/o/${encodeURI(blob.name)}?alt=media`;
urls.push(`{ ${key}: ${publicUrl} }`);
console.log("urls push log", urls);
});
console.log("urls .on() log", urls);
blobWriter.write(value[0].buffer);
blobWriter.end();
}
return urls;
};
imagesWriteFunction().then( (urls) => {
console.log("iamgeUrls log", urls);
//I a want to access urls here so I can send with other form data to Post doc in firestore.
});
res.status(200).send(newPostData);
} catch (err) {
console.log("createPost error", err);
}
}
);
控制台日志
---Starting upload process for cardImage---
Sending image cardImage: [object Object] to Storage
---Starting upload process for postImageOne---
Sending image postImageOne: [object Object] to Storage
---Starting upload process for postImageTwo---
Sending image postImageTwo: [object Object] to Storage
urls log []
imagesWriteFunction urls log []
---newPostRes--- zt0OkMbLg2osceAtf3Vo
---Successfully added to user posts array--- WriteResult {
_writeTime: Timestamp { _seconds: 1622789685, _nanoseconds: 86941000 }
}
---Assemblying Public URL--- woodywoodpecker.png
urls push log [
'{ postImageOne: https://firebasestorage.googleapis.com/v0/b/devport-express-backend.appspot.com/ImagePosts/o/woodywoodpecker.png?alt=media }'
]
---Assemblying Public URL--- images.jpg
urls push log [
'{ postImageOne: https://firebasestorage.googleapis.com/v0/b/devport-express-backend.appspot.com/ImagePosts/o/woodywoodpecker.png?alt=media }',
'{ postImageTwo: https://firebasestorage.googleapis.com/v0/b/devport-express-backend.appspot.com/ImagePosts/o/images.jpg?alt=media }'
]
---Assemblying Public URL--- johnnybravo.jpg
urls push log [
'{ postImageOne: https://firebasestorage.googleapis.com/v0/b/devport-express-backend.appspot.com/ImagePosts/o/woodywoodpecker.png?alt=media }',
'{ postImageTwo: https://firebasestorage.googleapis.com/v0/b/devport-express-backend.appspot.com/ImagePosts/o/images.jpg?alt=media }',
'{ cardImage: https://firebasestorage.googleapis.com/v0/b/devport-express-backend.appspot.com/ImagePosts/o/johnnybravo.jpg?alt=media }'
]
[nodemon] restarting due to changes...
[nodemon] starting `node index index.js`
Server started on port: 5000
【问题讨论】:
-
blob.createWriteStream是一个异步函数。 -
谢谢,但我不确定这会如何影响我的阵列设置?
-
我试图 await blob.createWriteStream().on() 但 await 似乎对那种类型的表达式没有影响。
标签: node.js firebase express firebase-storage