Функция, возвращающая код

На сервере есть модуль:

const handlers = {
    isExists() {
        return function(user) {
            if (!user) {
                return res.status(200).json({
                    msg: "Такого пользователя не существует"
                });
            }
        };
    }
}

module.exports = handlers;

При попытке вызвать возвращает ошибку:

const express = require('express');
const handlers = require('../modules/handlers');
const router = express.Router();

router.post('/edit',
    async(req, res) => {
        try {
            handlers.isExists()(null);
        } catch (err) {
            return res.status(500).json({
                msg: config.get("500err"),
                err: err.stack
            })
        }
    }
);
{
    "msg": "Непредвиденная ошибка, попробуйте снова",
    "err": "ReferenceError: res is not defined\n    at C:\\path\\modules\\handlers.js:5:17\n    at C:\\path\\routes\\news.routes.js:93:32\n    at processTicksAndRejections (internal/process/task_queues.js:97:5)"
}

Так же пытался вызывать так:

const isExists = handlers.isExists();

isExists(null)

Все равно вылазит ошибка.

Как её можно исправить и почему она происходит?


Если передавать res в функцию, то вылазит другая ошибка

isExists(null, res)
const handlers = {
    isExists() {
        return function(user, res) {
            if (!user) {
                return res.status(200).json({
                    msg: "Такого пользователя не существует"
                });
            }
        };
    }
}

module.exports = handlers;

UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client



Ответы (1 шт):

Автор решения: vsemozhebuty

Лексическое окружение для функции создаётся при создании функции, а не при её вызове. То, что происходит у вас, можно упростить до такого кода:

function foo() {
  console.log(bar);
}

{
  const bar = 42;
  foo();
}

Как вы видите, у функции нет доступа к контексту вызова, только к контексту создания.

→ Ссылка