如何将响应数据存储到节点js中当前函数之外的数组中?

How to store response data into an array out of the current function in node js?

我如何将所有结果数据存储到 pImages 数组中?我得到了结果,但在那种情况下,我认为异步函数可以工作,但我不知道如何应用它。请帮忙,我的密码是

exports.addImage = (req, res, next) => {
    let imageArray = req.files.productImageArray;

    if (!req.files || Object.keys(req.files).length === 0) {
        return res.status(400).send("No files were uploaded.");
    }
    
    // here all images will be stored in array format
        let pImages = [];

         for (let f in imageArray) {
            imagekit.upload(
                {
                    file: imageArray[f].data, //required
                    fileName: imageArray[f].name, //required
                    customMetadata: {
                        color: req.body.productLabels[f],
                        default: req.body.defaultProduct[f]
                    }
                },
                function(error, result) {
                    if (error) console.log(error);
                    else {
                        console.log(result)
                        pImages.push(result)
                    }
                }
            );
        }

    console.log("p", pImages); //output p []
   
};

提前致谢

您可以将 imagekit.upload(...) 包裹在一个承诺中,然后等待这个承诺。

因此,您的承诺必须在 imagekit.upload 的回调中得到解决或拒绝。

请注意,您的 addImage 方法现在必须异步才能使用 await 关键字,因此 returns 本身就是一个承诺。

exports.addImage = async (req, res, next) => {
    let imageArray = req.files.productImageArray;

    if (!req.files || Object.keys(req.files).length === 0) {
        return res.status(400).send("No files were uploaded.");
    }
    
    // here all images will be stored in array format
        let pImages = [];

         for (let f in imageArray) {
            try{
                const pImage = await new Promise((resolve,reject)=>{
                    imagekit.upload(
                        {
                            file: imageArray[f].data, //required
                            fileName: imageArray[f].name, //required
                            customMetadata: {
                                color: req.body.productLabels[f],
                                default: req.body.defaultProduct[f]
                            }
                        },
                        function(error, result) {
                            if (error){
                                reject(error);
                            } else {
                                resolve(result)
                            }
                        }
                    );
                });
                pImages.push(pImage);
            } catch(e){
                console.error(e);
            }
        }

    console.log("p", pImages); //output p []
   
};

您的代码中还有其他内容我没有解决。

在第一行中,您正在访问 req.files.productImageArray,而没有检查是否定义了 req.files。此检查在事后完成。所以你应该在检查后移动你的第一行。

req.files.productImageArray是一个如名字所说的数组吗?如果是这样,你不应该使用 for in 循环,而是使用 for of 循环,在你的健全性检查中你应该包括 Array.isArray(req.files.productImageArray).