Как вытащить обработчик с помощью модуля экспорта? - PullRequest
0 голосов
/ 30 сентября 2018

Я создаю приложение для узла и пытаюсь аккуратно организовать свой код.Я написал последовательный модуль, который импортирует последовательные библиотеки и обрабатывает соединение.Мое намерение состояло в том, чтобы написать базовый модуль и затем использовать его снова и снова в различных проектах по мере необходимости.Единственная часть, которая изменяется в зависимости от использования - это обработка поступающих последовательных данных.По этой причине я хотел бы вытащить следующий обработчик и переопределить его в соответствии с потребностями проекта.Как я могу использовать экспорт модулей, чтобы переопределить только этот раздел файла?

Я попытался добавить myParser к экспорту, но это дает мне ноль, и я бы вышел за рамки.

Обработчик для переопределения / изменения / перегрузки для каждого нового проекта

myParser.on('data', (data) => {
    console.log(data)
    //DO SOMETHING WITH DATA
});

Пример использования: main.js

const serial = require('./serial');
const dataParser = require('./dataParser');
const serial = require('./serial');

//call connect with CL args
serial.connect(process.argv[2], Number(process.argv[3]))

serial.myParser.on('data',(data) => {
   //Do something unique with data
    if (dataParser.parse(data) == 0)
       serial.send('Error');
});

Полный модуль JS ниже serial.js

const SerialPort = require('serialport');
const ReadLine = require('@serialport/parser-readline');
const _d = String.fromCharCode(13); //char EOL


let myPort = null;
let myParser = null;

function connect(port, baud) {
     let portName = port || `COM1`;
     let baudRate = baud || 115200;

     myPort = new SerialPort(portName, {baudRate: baudRate})
     myParser = myPort.pipe(new ReadLine({ delimiter: '\n'}))

     //Handlers
    myPort.on('open', () => {
        console.log(`port ${portName} open`)
    });

    myParser.on('data', (data) => {
        console.log(data)
    });

    myPort.on('close', () => {
        console.log(`port ${portName} closed`)
    });

    myPort.on('error', (err) => {
        console.error('port error: ' + err)
    });
}

function getPorts() {
    let portlist = [];
    SerialPort.list((err, ports) => {
        ports.forEach(port => {
            portlist.push(port.comName)
        });
    })
    return portlist;
}

function send(data) {
    myPort.write(JSON.stringify(data) + _d, function (err) {
        if (err) {
            return console.log('Error on write: ', err.message);
        }
        console.log(`${data} sent`);
    });
}

function close() {
    myPort.close();
}


module.exports = {
    connect, getPorts, send, close
}

1 Ответ

0 голосов
/ 30 сентября 2018

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

Это может быть фабрика:

module.exports = function connect(port, baud) {
     let portName = port || `COM1`;
     let baudRate = baud || 115200;

     let myPort = new SerialPort(portName, {baudRate: baudRate})
     let myParser = myPort.pipe(new ReadLine({ delimiter: '\n'}))

     //Handlers
    myPort.on('open', () => {
        console.log(`port ${portName} open`)
    });

    myParser.on('data', (data) => {
        console.log(data)
    });

    myPort.on('close', () => {
        console.log(`port ${portName} closed`)
    });

    myPort.on('error', (err) => {
        console.error('port error: ' + err)
    });

    function getPorts() {
        let portlist = [];
        SerialPort.list((err, ports) => {
            ports.forEach(port => {
                portlist.push(port.comName)
            });
        })
        return portlist;
    }

    function send(data) {
        myPort.write(JSON.stringify(data) + _d, function (err) {
            if (err) {
                return console.log('Error on write: ', err.message);
            }
            console.log(`${data} sent`);
        });
    }

    function close() {
        myPort.close();
    }

    return {
        myParser, getPorts, send, close
    };
}

Так что это может быть использовано как:

const serial = require('./serial');

const connection = serial(...);

connection.myParser.on('data',(data) => {
   //Do something unique with data
    if (dataParser.parse(data) == 0)
       connection.send('Error');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...