调用类方法时,'这'未定义

我试图设置一个响应消息给用户,但是当我这样做,我得到一个错误。 (不能读取未定义的属性'消息')这是不工作的代码:

server.js

const server = express(); let App = require('./controllers/app'); App = new App(); server.use('/', App.router); http.createServer(server).listen(8080); 

app.js

 class App { constructor () { this.message = ''; } router (request, response) { if (request.url === '/register') { response.render('register.ejs', { url: request.url, header: headBase + 'register', message: this.message, // This is where the error is triggered user: username }); this.message = ''; } } } 

任何地方我尝试设置或阅读在路由器方法this.message我得到的错误。

问题在这里

 let App = require('./controllers/app'); App = new App(); server.use('/', App.router); 

在我深入探讨真正的问题之前,我还会提到用App 实例覆盖App程序是一个坏主意,所以我将重写为:

 const App = require('./controllser/app') const app = new App(); server.use('/', app.router); 

现在更清楚的是你传入的是App实例的方法引用。

问题是你正在传递函数,但函数没有以任何方式绑定到app 。 有很多方法可以解决这个问题。

最简单的方法是传递app.router.bind(app)app.router包装在一个调用app上下文中的app.router的函数中:

 server.use('/', app.router.bind(app)) 

下一个最简单的(就像你使用ES2015的function一样)是用lambda函数包装函数:

 server.use('/', (...args) => app.router(...args)) 

我设法解决它。 我刚刚在路由器方法App.message更改为App.message

 class App { constructor () { this.message = ''; } router (request, response) { if (request.url === '/register') { response.render('register.ejs', { url: request.url, header: headBase + 'register', message: App.message, user: username }); App.message = ''; } } } 

一个替代zzzzBov解决scheme可以绑定在构造函数中的方法:

 class App { constructor () { this.message = ''; this.router = this.router.bind(this) } router (request, response) { if (request.url === '/register') { response.render('register.ejs', { url: request.url, header: headBase + 'register', message: this.message, user: username }); this.message = ''; } } }