Как использовать readline в NodeJs для события (ожидание закрытия потока) - PullRequest
0 голосов
/ 15 июня 2019

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

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

Последний эксперимент был таким:

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

// bot.listen("message").reply(responseText())

function readFile(file) {
    var text = '';
        var readInterface = readline.createInterface({
            input: fs.createReadStream(file),
            terminal: false
        });

        readInterface.on('line', function(line) {
            linea = line.trim();
            console.log(linea);
            text += linea;
        }).on('close', function() {
            return text;
        });
    });
}

async function responseText() {
    var content = await readFile("file.txt");
    content.then(function(data) {
        return data;
    })
}

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

Спасибо всем

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Если вы используете express.js или какой-либо фреймворк, построенный поверх него, вы можете просто направить поток чтения к ответу, так как ответы express являются потоками для начала:

const es = require('event-stream')
...
let getFileStream = path => (
fs.createReadStream(path)
.pipe(es.split())
.pipe(es.map(function (data, cb) { 
      cb(null
        , inspect(JSON.parse(data)))  
    }))
);

router.get('/message', function (req, res, next) {
   let file$ = getFileStream(yourFilePath)
       file$.on('error', next).pipe(res)

})

Если вам нужно преобразоватьсодержимое файла, вы можете использовать transform stream или, как показано в примере выше, синхронное отображение потока событий.Идея состоит в том, чтобы всегда поиграться с содержимым файла на уровне потока, чтобы избежать необходимости загружать все содержимое файла в память.

Вы действительно не хотите буферизовать все содержимое файла в памяти.Это может быстро стать проблемой с огромными файлами в напряженный день.что вам нужно, это направить поток файлов прямо в браузер.Тот же принцип применим к любому типу потребителей.

Конечно, если механизм полностью внутренний, вы должны только передавать путь к файлу или реальный поток, пока вам не потребуется фактически открыть файл и что-то сделать ссодержание.В этом случае вы вернетесь к своему потоковому инструментарию, будь то реализация нативного потокового API-интерфейса node.js, пакет события-потока или какая-то наблюдаемая библиотека, например rxjs.

0 голосов
/ 15 июня 2019

Если вы хотите использовать async-await, нужно создать обещание и вернуть его.

function readFile(file) {
    return new Promise((res, rej) => {
        try {
            var text = '';
            var readInterface = readline.createInterface({
                input: fs.createReadStream(file),
                terminal: false
            });

            readInterface
                .on('line', function (line) {
                    linea = line.trim();
                    text += linea;
                })
                .on('close', function () {
                    res(text);
                });
        } catch(err){
            rej(err)
        }
    });
}
...