node.js - express.js 实例化 Controller 中出现意外值 'this'

标签 node.js express prototype this undefined

“this”似乎不是指实例化的预算 Controller 对象。相反,它似乎指的是全局对象。有谁知道这是为什么吗?

我定义了一个预算模型。注入(inject) Controller ,当我在应用程序中点击/budgets 时,我试图简单地生成一个随机的 6 个字符字符串。相反, this.DEFAULT_SLUG_LENGTH 未定义,我不明白为什么。

这是一个简化的测试用例,说明了“this”的问题。当在另一个函数中引用注入(inject)的 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);

如果我在 Node repl 中手动实例化模型/ Controller ,则generateSlug方法可以正常工作。如果我重构我的代码,使 BudgetController 成为一个返回带有方法的对象 {} 的函数,那么似乎工作得很好。我使用prototype/new有什么问题吗?

最佳答案

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

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

关于node.js - express.js 实例化 Controller 中出现意外值 'this',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17120838/

相关文章:

javascript - 用 object.create 定义的原型(prototype)的构造函数属性从哪里来?

node.js - Bcrypt:带有 Docker 和 Sails.JS 的无效 ELF header

javascript - 如何修复返回 `undefined` 的异步函数?

javascript - 在迭代到下一个循环之前如何等待每个内部完成?

javascript - 将原型(prototype)附加到 JavaScript 对象

javascript - 如何使原型(prototype)中的对象不在 javascript 中共享

javascript - 重构 Promise javascript 代码

Node.js - 从 wsdl 生成 Web 服务服务器/客户端框架

json - NodeJS/Knex 创建 Json 响应

node.js - Nodejs 中查询字符串的多种类型