This question already has answers here:
How to access the correct `this` inside a callback?
(13个回答)
已关闭6年。
以下代码有效:
但是,我的每个请求处理程序的代码几乎都相同,因此我认为我可以通过创建一个通用请求处理程序来减少重复代码:
并像这样修改我的请求处理程序:
但是我得到了:
该代码是通过我的route/index.js调用的
这是从我的app.js中调用的:
这是因为您将函数
因此,另一个解决方案是将匿名函数传递给
通常,当您遇到类似
它要么意味着
调用
正确的对象。
我相信
如同
在
(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