调用类方法时,'这'未定义
我试图设置一个响应消息给用户,但是当我这样做,我得到一个错误。 (不能读取未定义的属性'消息')这是不工作的代码:
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 = ''; } } }