Как получить доступ к глобальным переменным области видимости в функциях обратного вызова? [JS]

Для моей регистрации пользователя у меня есть

const express = require ('express');
const userRouter = express.Router ();

userRouter.get ('/', function getUserList (req, res) {
    let User = require ('../models').User;
    User.find ({}, function (err, list) {
        res.json (list);
    });
});

userRouter.post ('/', function createUser (req, res) {
    let User = require ('../models').User;
    if (req.body.username && req.body.password)
        User.create (req.body, function (err, user) {
            res.json (user);
        });
});

... 3 more functions with the same `let User` ...

module.exports = userRouter;

Здесь мне нужно дважды подключить require модели модуля. Я попытался установить переменную пользователя в качестве глобальной переменной вверху программы, например

const express = ..., userRouter = ...
var User = ...

Однако эта переменная пользователя по-прежнему недоступна в моих функциях обратного вызова.

Требуется ли многократное использование пользовательского модуля, чтобы это сделать, или я что-то упустил?

редактировать: внутри функций обратного вызова переменная пользователя не определена.

нет причин, по которым он не должен быть доступен при объявлении вне обратных вызовов. Какие ошибки возникают?

charlietfl 28.04.2018 13:42

Я думаю, что у узла есть специальная глобальная переменная

Doug 28.04.2018 13:46

global.User = ... stackabuse.com/using-global-variables-in-node-js

Doug 28.04.2018 13:48

Вы можете показать, что находится в вашем файле models?

Matt Way 28.04.2018 13:50

@Doug собирался опубликовать это, но вы упомянули об этом первым, поэтому я думаю, вам следует опубликовать это в качестве ответа.

AndrewL64 28.04.2018 13:50

Давай @AndrewL Я говорю по телефону. Легче оставить комментарий, чем ответ

Doug 28.04.2018 13:52

@charlietfl Нет ошибки, это просто неопределено, когда я определяю ее вне обратных вызовов.

vixrant 29.04.2018 04:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
4 329
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как упоминал @Doug, вы должны передать global в пользовательскую переменную следующим образом:

global.user = ...

По сути, этот процесс превращает user в глобально доступную переменную. Вы можете узнать больше о Node global здесь, чтобы понять, что он делает, а также понять, каковы его последствия: http://stackabuse.com/using-global-variables-in-node-js/

Нет, не следует использовать глобальную переменную. Константы на уровне модуля должно быть достаточно.

Bergi 28.04.2018 16:27

@Bergi согласился. Это также упоминается в приведенной мной ссылке. Но они также показали, в каких ситуациях может потребоваться использование глобальной переменной.

AndrewL64 28.04.2018 16:52

Да, я просто говорю, что это не одна из этих ситуаций.

Bergi 28.04.2018 16:54

Это сделает мою переменную пользователя доступной во всех модулях, верно? Я не хочу этого, я хочу, чтобы он был доступен в обратных вызовах того же модуля. Этого не происходит, потому что обратные вызовы говорят, что переменная пользователя не определена.

vixrant 29.04.2018 04:44

С точки зрения @charloetfl, если он находится внутри файла, следует объявить его вне обратного вызова или поверх файла. Если мы говорим о доступе ко всем модулям и файлам в проекте, то добавление его к глобальному объекту - это способ сделать это в узле, как упоминалось в @doug и @andrewl.

Объявление пользователя вне приводит к тому, что функции обратного вызова сообщают, что переменная пользователя не определена.

vixrant 29.04.2018 04:45

Поскольку использование global также не рекомендуется при разработке узлов, я бы рекомендовал изучить возможность создания переменной User в app.locals, чтобы она была доступна в вашем объекте req через req.app.locals, как описано в expressjs.com/en/api.html#app.locals. Надеюсь это поможет.

vredrav 30.04.2018 04:22

Другие вопросы по теме