0

これがサンプルコード、2 つのファイルと「クラス」です。

メソッドが定義された CRUD クラスでは、このコンテキストが次のコードで変更されるルートを設定すると、this.modelName で問題が発生します。

問題は、 modelName を定義した CRUD の下で同じスコープを取得する方法です。

server.get('/users/:id', UserRoutes.find);

コード:

var db = require('../models');

function CRUD(modelName) {
    this.modelName = modelName;
    this.db = db;
}

CRUD.prototype = {

    ping: function (req, res, next) {
        res.json(200, { works: 1 });
    },

    list: function (req, res, next) {

        // FAILS BECAUSE the modelName is undefined
        console.log(this);

        db[this.modelName].findAll()
            .success(function (object) {
                res.json(200, object);
            })
            .fail(function (error) {
                res.json(500, { msg: error });
            });
    }
};

module.exports = CRUD;

UserRoutes クラス:

var CRUD = require('../utils/CRUD'),
util = require('util');

var UserModel = function() {
    UserModel.super_.apply(this, arguments);
};

util.inherits(UserModel, CRUD);

var userRoutes = new UserModel('User');

module.exports = userRoutes;
4

2 に答える 2

2

別の場所でハンドラーとして使用していると仮定しますuserRoutes.list。つまり、コンテキストが変更されます。その場合、これは簡単な解決策になるはずです:

function CRUD(modelName) {
    this.modelName = modelName;
    this.db = db;
    this.list = CRUD.prototype.list.bind(this);
}

thisそのソリューションでは「他の」にアクセスできないことに注意してください(どのように呼び出されても、永続的にインスタンスにthisバインドされます)。CRUD.list

もう1つのオプションは、関数ジェネレーターに変換することです(これは、他のコンテキストから引き続き使用できることを除いて、ほとんどlist同じです):.bindthis

CRUD.prototype = {
    // some code

    list: function() {
        var that = this;
        return function (req, res, next) {
            console.log(that);

            db[that.modelName].findAll()
                .success(function (object) {
                    res.json(200, object);
                })
                .fail(function (error) {
                    res.json(500, { msg: error });
                });
        }
    }
};

その後userRoutes.list()、ハンドラーとして使用します。

于 2013-09-24T19:38:46.897 に答える