Как я могу получить доступ к выводу функций через Node.js? - PullRequest
1 голос
/ 15 апреля 2020

У меня есть 3 файла:

Ингредиенты. js

const fs = require("fs");
const readline = require('readline');
const stream = require('stream');


const ingredients = () => {
    const instream = fs.createReadStream('ingredients.txt');
    const outstream = new stream;
    const rl = readline.createInterface(instream, outstream);

    const listIngredients = {};


    rl.on('line', function (line) {
        let lower = line.toLowerCase();
        listIngredients[lower] = 0; 
    });

    rl.on('close', function () {
        console.log('listIngredients', listIngredients);
    });
}

module.exports = ingredients;

поваренная книга. js:

let fs = require("fs");

const book = () => {

    const regex = /\b(\w+)\b/g;

    fs.readFile('cook-book.txt', 'utf8', function (err, data) {

        let book = data;
        let lower = book.toLowerCase();
        let split = lower.match(regex);
        console.log(split);
    });

}
module.exports = book;

сравнить. js

const ingredients = require('./ingredients');
const book = require('./book');

Я пытаюсь увеличивать ключевые значения ингредиентов каждый раз, когда они упоминаются в кулинарной книге. Я думаю, что это должно go в другой js файл, чтобы сделать его чище.

Хотя я могу console.log извлечь информацию из вышеуказанных файлов, я не могу понять, как на самом деле получить доступ к данным и внести изменения в объект ингредиентов в сравнении. js?

1 Ответ

1 голос
/ 15 апреля 2020

как и другие заметили, ваши переменные ingredients и book - это функции, которые запрашивают информацию внутри своей области и не возвращают ее наружу. чтобы исправить это, вы должны вернуть значения.

, так как вы работаете с асинхронными вещами, ваши функции должны быть заключены в Promise для правильной обработки потока.

этот код должны помочь вам:

const fs = require('fs');
const readline = require('readline');
const { Writable } = require('stream');
const fsp = fs.promises;

// ingredients.js
const getIngredients = async () => new Promise((resolve, reject) => {
  const instream = fs.createReadStream('ingredients.txt');
  const outstream = new Writable();
  const rl = readline.createInterface(instream, outstream);

  const listIngredients = {};

  rl.on('line', line => {
    const lower = line.toLowerCase();
    listIngredients[lower] = 0;
  });
  rl.on('error', reject);
  rl.on('close', () => resolve(listIngredients));
});

// cookbook.js
const getBookContent = async () => new Promise(async (resolve, reject) => {
  try {
    const wordRegEx = /\b(\w+)\b/g;
    const book = await fsp.readFile('cook-book.txt', 'utf8')
    const lower = book.toLowerCase();
    return resolve(lower.match(wordRegEx));
  } catch (error) {
    return reject(error);
  }
});

// compare.js
(async () => {
  const ingredients = await getIngredients();
  const words = await getBookContent();
  console.log(ingredients);
  console.log(words);
})();

имена функций были изменены для лучшего представления их экземпляров.

я также использовал async iife для используйте синтаксис async/await, однако вы все еще можете работать с Promise s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...