NodeJS Express中间件- TypeError:无法将私有成员#nextId写入类未声明的对象

kgqe7b3p  于 2023-04-29  发布在  Node.js
关注(0)|答案(1)|浏览(132)

我正在为我的express JS应用程序编写一个自定义日志,我在中间件函数中得到一个错误TypeError: Cannot write private member #nextId to an object whose class did not declare it。下面是我的一些代码:
logger.js:

const logger = new class Logger {
   // ....
   #nextId = 0;
   // ....
   setupMiddleware(req, res, next) {
        // ....
        if (!fs.existsSync(logFilename))
            this.#nextId = 0; // HERE IS THE ERROR
        // ...
        next();
   }
   // ...
}
module.exports = logger;

main.js:

// ... requirements
server.use(logger.setupMiddleware); // this is the function!!
server.use(express.json());
server.use(delEmptyData);
server.use(queryToBody);
server.use(logger.startMiddleware);
// ... routing
server.use(exceptionHandler); // Exception handling
server.use(logger.endMiddleware);
// ... rest of the code

我认为中间件不提供this上下文之类的东西,但我不知道如何解决这个问题。(我也试着让它全部静态化,但我得到了更令人困惑的错误)
谢谢!

zxlwwiss

zxlwwiss1#

原因是因为你提到的this上下文。有很多问题/文章解释了如何使用它,但我将在这里为您的情况给予一个简短的解释。
一般的想法是,当你通过直接引用类方法来使用它时,就像这样:logger.setupMiddleware,函数不绑定到特定示例。为了解决这个问题,您可以使用以下方法之一:
1.在构造函数中手动绑定它:

class Logger {
  constructor() {
    this.setupMiddleware = this.setupMiddleware.bind(this);
  }
}

1.把它变成一个类属性(More info here)

class Logger {
  setupMiddleware = (req, res, next) => {
  }
}

1.在您的呼叫者中绑定它:

server.use(logger.setupMiddleware.bind(logger));

你可以在这里阅读更多关于这个Function.prototype.bind()方法的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind

相关问题