2

Есть router на express:

import Router from "express";
import ModbusController from "../Controllers/ModbusController.js";

const mb = new ModbusController();

const modbusRouter = new Router();

modbusRouter.get('/write/:id/:action', (req, res) => mb.writeSingleCoil(req, res)); modbusRouter.get('/read/:id', (req, res) => mb.readSingleCoil(req, res)); modbusRouter.get('/read', (req, res) => mb.readAllCoils(req, res));

export default modbusRouter;

Есть класс ModbusController:

import modbus from "jsmodbus";
import net from "net";
import dotenv from "dotenv";

export default class ModbusController { // много неважного кода readSingleCoil(req, res) { const {id} = req.params this.client.readCoils(id,1) .then( resp => { const coilStatus = resp.response._body._valuesAsArray[0]; res.status(200).json({ch: id, status: coilStatus}) }) .catch(e => this.errorOccurred(e)) }

Так все работает, но я почти на 100% уверен, что строчку вызова функции из контроллера можно записать так:

modbusRouter.get('/read/:id', mb.readSingleCoil);

Почему у меня выскакивает ошибка: '(node:11488) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'readSingleCoil' of undefined' ?

1 Answers1

2

Потому что, когда Вы делаете

modbusRouter.get('/read/:id', mb.readSingleCoil);

Вы передаете в get функцию без контекста.


Если очень хочется избавиться от анонимной функции во втором параметре:

modbusRouter.get('/read/:id', mb.readSingleCoil.bind(mb));
  • отличный развёрнутый ответ! – aleksandr barakin Jan 27 '22 at 13:21
  • Но ведь если сделать такую функцию: test(req, res) { return res.status(200).json('OK') } то вызов modbusRouter.get('/test', mb.test); нормально работает. Там что-то с async await нужно сделать – merlinby Jan 27 '22 at 13:25
  • @merlinby "то вызов ... нормально работает" - ключевое слово - "контекст". В test Вы нигде не обращаетесь к this. –  Jan 27 '22 at 13:39
  • @igor вроде начинает понемногу доходить. Почитал ветку, которую повесили на "дубликат". Т.е. правильно я понял, что в моем случае нужно просто оставить код как есть и не дурить головы? – merlinby Jan 27 '22 at 13:43
  • @merlinby Да, оставить. –  Jan 27 '22 at 13:56
  • @merlinby modbusRouter.get('/read/:id', mb.readSingleCoil.bind(mb)); –  Jan 27 '22 at 13:58
  • 1
    @igor Спасибо огромное! Думаю можно написать в основном Вашем ответе, может кому понадобиться такая конструкция. – merlinby Jan 27 '22 at 14:21
  • 1
    @aleksandrbarakin наконец-то у Александра эйфория, катарсис от ответов Игоря :D – Алексей Шиманский Jan 27 '22 at 14:46