找不到javascript实例方法:对象#<object>没有方法&#39; handleRequest&#39; </object>

时间:2014-06-29 18:08:12

标签: javascript node.js express

以下代码有效:

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' 

通过我的routes / 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);

2 个答案:

答案 0 :(得分:2)

更新

您收到此错误是因为您应该将exptrs绑定到这样的函数:

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'等错误时, 它要么意味着

  1. .prototype.handleRequest()未正确定义,

  2. 调用.handleRequest()的对象实际上并不是 正确的对象。

  3. 我相信返回.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(..)中你也应该返回{{1}},而不是仅仅回复它。

答案 1 :(得分:0)

我能够通过以下方式解决这个问题:

首先,我注意到我的handleRequest()没有使用'this',所以它可能是一个简单的函数

其次,我通过在promise

周围添加Promise.try()来修改handleRequest()
handleRequest = function(promise, res)
{
    return Promise.try(function(){
        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);
        }
    });
};