在express.js中实例化的控制器中的“this”的意外值

“this”似乎并不涉及实例化的预算控制器对象。 相反,它似乎是指全局对象。 有人知道为什么吗?

我已经定义了一个预算模型。 注入控制器,我试图简单地生成一个随机的6个string,当我在我的应用程序中打/预算。 相反,这个.DEFAULT_SLUG_LENGTH是不确定的,我不明白为什么。

这是一个愚蠢的testing案例,说明这个问题。 在引用另一个函数中的this.budget来根据slug值查询数据库时,我遇到了类似的问题。

//models/budget.js var Schema = require('jugglingdb').Schema; var schema = new Schema('postgres',{url:process.env.DATABASE_URL}); var Budget = schema.define('budgets',{ total: Number, slug: String }); module.exports = Budget; ==================== //controllers/budget.js function BudgetController (budget) { this.budget = budget; }; BudgetController.prototype.DEFAULT_SLUG_LENGTH = 6; BudgetController.prototype.generateSlug = function (req,res) { var slug = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < this.DEFAULT_SLUG_LENGTH; i++) { slug += possible.charAt(Math.floor(Math.random() * possible.length)); } res.send(slug); }; module.exports = BudgetController; =================== //app.js var express = require('express'); var app = express(); app.use(express.bodyParser()); // models var Budget = require('./models/budget'); // controllers var BudgetController = require('./controllers/budget'); var budgetCtrl = new BudgetController(Budget); // routes app.get('/budgets',budgetCtrl.generateSlug); app.listen(process.env.PORT || 4730); 

如果手动实例化节点repl中的模型/控制器,generateSlug方法可以正常工作。 如果我重构我的代码,以便BudgetController是一个函数返回一个对象与方法,似乎工作正常。 我使用原型/新的有一些问题吗?

express不需要前面的对象就可以调用它们,所以如果你想使用绑定到特定的对象方法作为一个快速路由处理函数,你需要绑定它:

 app.get('/budgets', budgetCtrl.generateSlug.bind(budgetCtrl));