express.js实例化控制器中'this'的意外值

时间:2013-06-15 06:25:35

标签: node.js express prototype this undefined

'this'似乎不是指实例化的预算控制器对象。相反,它似乎是指全局对象。有谁知道这是为什么?

我已经定义了预算模型。注入到控制器中,当我在我的应用程序中点击/预算时,我试图简单地生成一个随机的6个字符串。相反,this.DEFAULT_SLUG_LENGTH未定义,我无法弄清楚原因。

这是一个愚蠢的测试案例,说明了“这个”的问题。在引用另一个函数中的注入this.budget时,我有一个类似的问题,根据slug值查询db。

//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是一个返回带有方法的对象{}的函数,那似乎工作正常。我使用prototype / new有什么问题吗?

1 个答案:

答案 0 :(得分:2)

express接受函数并在没有前面的对象的情况下调用它们,因此如果要使用绑定到特定this的对象方法作为快速路由处理函数,则需要绑定它:

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