我正在尝试在我的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
的最后两个参数,它就可以工作。我正在使用Addy Osmani的Backbone.js应用程序书的第5章来为您提供一些背景知识。为什么这不起作用?这样做是件好事,还是我尝试了不推荐的东西?
答案 0 :(得分:1)
你有两个问题:
findBooks
尝试访问response
,但此时response
不在范围内。findBooks
的函数时,您正在使用err
和books
调用BookModel.find
并将返回值传递给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) );
});