![](/img/trans.png)
[英]Why am i getting an error app.get is not a function in express.js
[英]Why cant I pull the callback out of the app.get function in node and express.js?
我正在尝试在我的server.js文件中执行此操作:
// doesn't work... don't know why.
var findBooks = function (err, books) {
if (!err) {
return response.send(books);
} else {
console.log(err);
}
}
// Get all books
app.get('/api/books', function (request, response, err, books) {
return BookModel.find( findBooks(err, books));
});
当我在控制台中运行jQuery xhr时,它给我一个404错误,而当我在浏览器中请求页面时,它给了同样的错误。 如果我将回调放置在通常的位置,将findBooks
函数移动到调用它的BookModel.find
函数中,然后删除app.get
的最后两个参数,则app.get
。 我正在研究Addy Osmani的Backbone.js应用程序一书的第5章,为您提供一些背景信息。 为什么不起作用? 这是一件好事,还是我尝试了不推荐的事情?
您有两个问题:
findBooks
尝试访问response
,但是此时response
不在范围内。 find
进行调用时,您将使用err
和books
调用findBooks
并将返回值传递给BookModel.find
。 让我们首先解决第二个问题。 而不是调用该函数,只需传递它:
return BookModel.find(findBooks);
那很简单。 现在,要解决第一个问题,我们需要在findBooks
添加一个额外的参数。 我会假设您将其放在开头,因为稍后会详细说明。 然后,我们可以将用法更改为如下所示:
return BookModel.find(function (err, books) {
return findBooks(response, err, books);
});
但是事实证明,使用bind
可以实现一种更简洁的方法。 bind
以绑定this
的值而闻名,但是它也可以用来绑定参数:
return BookModel.find(findBooks.bind(null, response));
总之,我们得到:
function findBooks (response, err, books) {
if (!err) {
return response.send(books);
} else {
console.log(err);
}
}
// Get all books
app.get('/api/books', function (request, response) {
return BookModel.find( findBooks.bind(null, response) );
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.