我正在为我的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
上下文之类的东西,但我不知道如何解决这个问题。(我也试着让它全部静态化,但我得到了更令人困惑的错误)
谢谢!
1条答案
按热度按时间zxlwwiss1#
原因是因为你提到的
this
上下文。有很多问题/文章解释了如何使用它,但我将在这里为您的情况给予一个简短的解释。一般的想法是,当你通过直接引用类方法来使用它时,就像这样:
logger.setupMiddleware
,函数不绑定到特定示例。为了解决这个问题,您可以使用以下方法之一:1.在构造函数中手动绑定它:
1.把它变成一个类属性(More info here):
1.在您的呼叫者中绑定它:
你可以在这里阅读更多关于这个
Function.prototype.bind()
方法的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind