This question already has answers here:
How to access the correct `this` inside a callback?

(13个回答)


已关闭6年。




以下代码有效:
Experimenters = function(db)
{
    Object.apply(this, arguments);
    this.db = db;
};
util.inherits(Experimenters, Object);


Experimenters.prototype.getAll = function(req, res)
{
    return this.db.Experimenter.getAllExperimentersWithExperiments()
    .then(function(exptrs) {
        res.json(200, exptrs);
    })
    .catch(function(error) {
        res.json(500, error);
    });
};

但是,我的每个请求处理程序的代码几乎都相同,因此我认为我可以通过创建一个通用请求处理程序来减少重复代码:
Experimenters.prototype.handleRequest = function(promise, res)
{
    return promise
    .then(function(success){
        res.json(200, success);
    })
    .catch(function(error) {
        if (error instanceof dbErrors.NotFoundError) {
            res.json(404, error);
        } else if ((error instanceof dbErrors.ValidationError) ||
                   (error instanceof dbErrors.UniqueConstraintError)) {
            res.json(422, error);
        } else {
            // unknown error
            console.error(error);
            res.json(500, error);
        }
    });
};

并像这样修改我的请求处理程序:
Experimenters.prototype.getAll = function(req, res)
{
    this.handleRequest(
        this.db.Experimenter.getAllExperimentersWithExperiments(),
        res);
};

但是我得到了:
TypeError: Object #<Object> has no method 'handleRequest'

该代码是通过我的route/index.js调用的
// edited for brevity
var Experimenters = require("../controllers/experimenters");

module.exports.initialize = function(app)
{
    var exptrs = new Experimenters(app.db);

    app.get("/api/experimenters", exptrs.getAll);
};

这是从我的app.js中调用的:
 //edited for brevity
 var config = require(path.join(__dirname, "..", "config")),
     createDB = require(path.join(__dirname, "models")),
     routes = require(path.join(__dirname, "routes"));

 var db = createDB(config);
 app.set("db", db);
 // edited for brevity
 routes.initialize(app);

最佳答案

更新:

您收到此错误,因为您应该将exptrs绑定(bind)到如下函数:

app.get("/api/experimenters", exptrs.getAll.bind(exptrs));

这是因为您将函数exptrs.getAll作为参数传递给.get调用的app函数,因此this中的exptrs.getAll将引用app

因此,另一个解决方案是将匿名函数传递给get:
app.get("/api/experimenters", function(){exptrs.getAll()});

通常,当您遇到类似Object #<Object> has no method 'handleRequest'的错误时,
它要么意味着
  • .prototype.handleRequest()定义不正确,或者
  • 调用.handleRequest()的对象实际上不是
    正确的对象。

  • 我相信.handleRequest的返回应该是promise().then(...).catch(...),而不是promise.then(...).catch(...),因为仅具有promise而没有()并不意味着您会调用该函数。

    如同
    var b = function(){
     return 1
    };
    
    function a(c){
        return c
    }
    
    var d = a(b);
    
    console.log(d);
    
    //it will not log 1, unless
    //function a(c){
    //  return c()
    //}
    

    .getAll中,您也应该返回this.handleRequest(..),而不是仅仅调用它。

    关于javascript - 找不到javascript实例方法: Object #<Object> has no method 'handleRequest' [duplicate],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24478806/

    10-09 08:13