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'?
因为当你这样做时
您正在传递给
get没有上下文的函数。如果你真的想去掉第二个参数中的匿名函数: