Y
Y
Yaroslav Kornilov2017-05-09 19:02:44
Node.js
Yaroslav Kornilov, 2017-05-09 19:02:44

The module returns undefined, why?

I have my module

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;

When evaluating a function, it returns the desired result. But when calling the same function imported into the server.js file, undefined is returned. What can be wrong?
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);

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
Dmitry Luzanov, 2017-05-09
@yaroslavkornilov

fs.readFile works asynchronously. Pass a callback to getDataObj or use promises.
More or less like this:

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

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question