Подтвердить что ты не робот

Почему я не могу позвонить в res.json?

У меня есть приложение expressjs и по определенному маршруту я вызываю функцию, которая отвечает с пользователем из базы данных, вызывая res.json с документом базы данных в качестве параметра. Я использую обетованные библиотеки, и я хотел бы включить обратный вызов, когда я помещаю документ базы данных в ответ. Но программа не работает, когда я это делаю. Может кто-нибудь объяснить, почему? Я также удивляюсь, почему на самом деле работают встроенные вызовы console.log. Существует ли принципиальное различие между двумя методами res.json и console.log?

Вот пример того, что работает и что не работает. Предположим, что getUserFromDatabase() возвращает обещание пользовательского документа.

//This works
var getUser = function(req, res) {
    getUserFromDatabase().then(function(doc) {
        res.json(doc);
    });    
} 

//This does not work (the server never responds to the request)
var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json);    
} 

//This works (the object is printed to the console)
var printUser = function(req, res) {
    getUserFromDatabase().then(console.log);    
} 
4b9b3361

Ответ 1

Функция json теряет правильную привязку this при ее использовании, так как .then будет ссылаться на нее напрямую без ссылки на родительский объект res, поэтому свяжите ее:

var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json.bind(res));    
}