nodejs, хранящий возвращаемое значение функции внутри переменной, дает мне неопределенное

#node.js #mongodb #mongoose #fs

Вопрос:

Здравствуйте, у меня есть функция в nodejs, которая ищет определенное слово внутри файла. Я хочу, чтобы возвращаемое значение этой функции хранилось внутри переменной, чтобы использовать его в API POST для mongodb и мангуста, но по какой-то причине оно возвращает его как неопределенное

Это мой API POST и функция Filetostring() внутри него

 router.post('/create',multer({ storage : storage}).any(), (req, res) => {
    var sample = fs.readFileSync('./uploads/' req.files[0].filename,'utf8');
    
     function Filetostring(){ 
        
        let arr = sample.split(/r?n/);
            arr.forEach((step , idx)=> {
            if(step.includes("step")){
            console.log(step);             //this gives me the first result I need

             return step;

            }

        
            }); 
     }
     let steps = Filetostring()
     console.log(steps) // This gives me undefined

    
    var tc = new Testcase({
        name: req.body.name,
        upload: req.files[0].filename ,
        
        run : steps, //this is where I want to put the returned value of the function
        
        modify: req.body.modify,
        delete: req.body.delete,
        step1: req.body.step1,
        step2: req.body.step2,
        step3: req.body.step3,
        step4: req.body.step4,
        step5: req.body.step5,
        step6: req.body.step6,
        step7: req.body.step7,
    });
    
    //const file = req.file;
    console.log(req.files[0].filename);
    tc.save((err, doc) => {
        if (err) { res.status(401).send("error") }
        else { 
            res.status(200).send(doc)
        }
    });
});

 

Это изображение моей консоли и результат работы каждой консоли журнала консоли

Может ли кто-нибудь сказать мне, что я делаю неправильно и почему переменные шаги дают мне неопределенность?

Ответ №1:

Проблема заключается в функции Filetostring , forEach метод не возвращает значение из внешнего вызова функции. Когда вы записываете return forEach обратный вызов, вы просто завершаете выполнение обратного вызова, но не возвращаете значение из Filetostring вызова.

Попробуй это.

 function Filetostring(){ 
    let arr = sample.split(/r?n/);
    // Find returns the first element that matches our criteria
    const step = arr.find((step , idx)=> {
        if (step.includes("step")) {
         console.log(step);             //this gives me the first result I need

         return true;

        }
        return false;
     }); 
   
   return step;
 }
 

UPD: Основываясь на отзывах в комментарии. Если вам нужно отфильтровать несколько элементов в массиве, а не первый filter , это должно сработать.

 function Filetostring(){ 
    let arr = sample.split(/r?n/);
    // Filter returns elements that matche our criteria
    const steps = arr.filter((step , idx)=> {
        return step.includes("step");
     }); 
   
   return steps;
 }
 

Комментарии:

1. Это работает, спасибо, но это дает мне всего 1 строку (только в первый раз, когда он находит слово «шаг»). когда я хочу, чтобы функция находила каждую строку со словом » шаг » .. останавливается ли arr.find (), когда она находит искомое значение один раз?

2. Да, так и есть. Если вам нужно найти все шаги, используйте filter метод. Я отредактирую ответ для вас.

3. Если это сработает, пожалуйста, отметьте комментарий как ответ.