繁体   English   中英

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

[英]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章,为您提供一些背景信息。 为什么不起作用? 这是一件好事,还是我尝试了不推荐的事情?

您有两个问题:

  1. findBooks尝试访问response ,但是此时response不在范围内。
  2. 当您可能希望将函数传递给find进行调用时,您将使用errbooks调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM