Javascript fs在array.foreach循环后返回未定义

Javascript fs在array.foreach循环后返回未定义,javascript,node.js,foreach,return,fs,Javascript,Node.js,Foreach,Return,Fs,我试图使用fs库读取一个文件,然后在迭代后替换一些元素,然后返回合成的字符串 但是,该函数返回未定义的 function concatproduce(order, producestring) { if (order.cart.produce[0].productid != null) { order.cart.produce.forEach((element, index) => { if (!element.delstatus) {

我试图使用fs库读取一个文件,然后在迭代后替换一些元素,然后返回合成的字符串 但是,该函数返回未定义的

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;
    }
}

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

该函数使用遍历每个product元素,请参阅提供的文档链接。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);
    }
}

fs.readFile是异步的。因此,fs.readFile的回调在执行返回的producestring之前不会调用,这就是为什么它总是返回undefined。我建议你花点时间看这部电影,否则你就是一个救生员。。。但是我想了解你的功能。。。这就像每次迭代后都返回一个值的迭代??然后将它连接到上一次迭代中的一个。。。我明白了吗?我更新了答案,如果你需要帮助,请告诉我。前面的答案已经起作用了。我只是在上面的答案中添加了一个带有链接的解释。方法不变,谢谢。我会再看一遍视频,但是这个功能起作用了。