以下代码有效:
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);
答案 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'
等错误时,
它要么意味着
.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(..)
中你也应该返回{{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);
}
});
};