fs returns 在 array.foreach 循环后未定义

fs returns undefined after array.foreach loop

我正在尝试使用 fs 库读取文件然后在迭代后替换一些元素然后 return 组合字符串 但是,函数 returns undefined

function concatproduce(order, producestring) {
    if (order.cart.produce[0].productid != null) {
        order.cart.produce.forEach((element, index) => {
            if (!element.delstatus) {
                element.delstatus = 'Pending';
            }
            fs.readFile('controllers/ordercartitemtemplate.html', 'utf8', function(err, data) {
                if (err) {
                    return console.log('lima' + err);
                }
                //console.log(data)
                producestring += (data
                    .replace('//Filename//', element.imageURL)
                    .replace('//Prodname//', element.producename)
                    .replace('//Quantity//', element.quantity)
                    .replace('//Price//', element.price)
                    .replace('//Total//', element.total)
                    .replace('//Delstatus//', element.delstatus));
            });
        });
        return producestring;
    }
}

也许这会对您有所帮助,我将异步文件读取操作更改为同步操作,并将 forEach 替换为 reduce

该函数使用 .reduce 遍历每个 produce 元素,请参阅提供的文档 link。 readFileAsync用于方便处理文件读取的结果,每次迭代后赋值给producestring

function concatproduce(order, producestring) {
    if (order.cart.produce[0].productid != null) {
        return order.cart.produce.reduce((producestring, element) => {
            if (!element.delstatus) {
                element.delstatus = 'Pending';
            }
            try {
                const data = fs.readFileSync('controllers/ordercartitemtemplate.html', 'utf8')
                producestring += (data
                    .replace('//Filename//', element.imageURL)
                    .replace('//Prodname//', element.producename)
                    .replace('//Quantity//', element.quantity)
                    .replace('//Price//', element.price)
                    .replace('//Total//', element.total)
                    .replace('//Delstatus//', element.delstatus));
                    return producestring;
            } catch (err) {
                console.log('lima' + err);
                return producestring;
            }
        }, producestring);
    }
}