为什么我不能从node和express.js中的app.get函数中提取回调?

时间:2013-10-21 02:18:34

标签: javascript node.js express

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

1 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. findBooks尝试访问response,但此时response不在范围内。
  2. 当您想要传递findBooks的函数时,您正在使用errbooks调用BookModel.find并将返回值传递给find打电话。
  3. 让我们先解决第二个问题。而不是调用函数,只需传递它:

    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) );
    });