yaroslavkornilov
@yaroslavkornilov
https://taplink.cc/the.yaroslav.kornilov

Модуль возвращает undefined, почему?

Есть мой модуль
const fs = require('fs')

const getDataObj = () => {
  const regex = /<email>(\D+?)<\/email>/g;
  fs.readFile('uploads/dataset.xml', "utf-8", function(err, data) {
    let m;
    let result = "";
    while ((m = regex.exec(data)) !== null) {
      if (m.index === regex.lastIndex) {
        regex.lastIndex++;
      }
      m.forEach((match, groupIndex) => {
        if (groupIndex === 1) {
          result += match + '\n'
        }
      });
    }
    return result
  })
}

exports.getDataObj = getDataObj;


При вычислении функции он возвращает нужный результат. Но при вызове этой же функции, импортированной в файл server.js возвращается undefined. В чем может быть дело?

const express = require('express')
const pug = require('pug');
const path = require('path');
const parser = require('./parser');

const app = express()

app.set('view engine', 'pug')
app.use('/static', express.static(__dirname + '/static'))

const multer = require('multer')
var upload = multer({
  dest: 'uploads/'
})

app.get('/', function(req, res) {
  console.log(parser.getDataObj());
  res.render(path.join(__dirname, 'views/index.pug'), {
    pageTitle: 'Hey',
    message: parser.getDataObj()
  })
})

app.listen(3000);
  • Вопрос задан
  • 309 просмотров
Решения вопроса 1
fs.readFile работает асинхронно. Передавайте в getDataObj callback или юзайте промисы.
Примерно так:
const getDataObj = (cb) => {
  const regex = /<email>(\D+?)<\/email>/g;
  fs.readFile('uploads/dataset.xml', "utf-8", function(err, data) {
    let m;
    let result = "";
    while ((m = regex.exec(data)) !== null) {
      if (m.index === regex.lastIndex) {
        regex.lastIndex++;
      }
      m.forEach((match, groupIndex) => {
        if (groupIndex === 1) {
          result += match + '\n'
        }
      });
    }
    return cb(result)
  })
}


app.get('/', function(req, res) {
  parser.getDataObj((message) => {
    res.render(path.join(__dirname, 'views/index.pug'), {
      pageTitle: 'Hey',
      message: message
    });
  });
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы