2

「this」は、インスタンス化された予算コントローラー オブジェクトを参照していないようです。代わりに、グローバル オブジェクトを参照しているようです。これがなぜなのか誰か知っていますか?

予算モデルを定義しました。コントローラーに挿入され、アプリで /budgets を押すと、単純にランダムな 6 文字の文字列を生成しようとしています。代わりに this.DEFAULT_SLUG_LENGTH が定義されておらず、その理由がわかりません。

これは、'this' に関する問題を説明する単純なテスト ケースです。別の関数内で挿入された this.budget を参照して、スラッグ値に基づいてデータベースを照会するときに、同様の問題があります。

//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 がメソッドを含むオブジェクト {} を返す関数になるようにコードを再構築すると、問題なく動作するように見えます。プロトタイプ/新規の使用に問題はありますか?

4

1 に答える 1

2

Express は関数を取り、前のオブジェクトなしでそれらを呼び出すため、特定のものにバインドされたオブジェクト メソッドをthis高速ルート ハンドラー関数として使用する場合は、それをバインドする必要があります。

app.get('/budgets', budgetCtrl.generateSlug.bind(budgetCtrl));
于 2013-06-15T07:12:31.550 に答える