0

我正在尝试在我的 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 Applications book 的第 5 章,为您提供一些背景信息。为什么这不起作用?这样做是一件好事,还是我在尝试一些不推荐的东西?

4

1 回答 1

1

你有两个问题:

  1. findBooks尝试访问response,但response此时不在范围内。
  2. 当您可能希望将函数传递给调用时,您findBooks使用errand调用books并将返回值传递给。BookModel.findfind

我们先解决第二个问题。而不是调用该函数,只需传递它:

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) );
});
于 2013-10-21T02:23:13.387 回答