#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. Если это сработает, пожалуйста, отметьте комментарий как ответ.