Для моей регистрации пользователя у меня есть
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 = ...
Однако эта переменная пользователя по-прежнему недоступна в моих функциях обратного вызова.
Требуется ли многократное использование пользовательского модуля, чтобы это сделать, или я что-то упустил?
редактировать: внутри функций обратного вызова переменная пользователя не определена.
Я думаю, что у узла есть специальная глобальная переменная
global.User = ... stackabuse.com/using-global-variables-in-node-js
Вы можете показать, что находится в вашем файле models?
@Doug собирался опубликовать это, но вы упомянули об этом первым, поэтому я думаю, вам следует опубликовать это в качестве ответа.
Давай @AndrewL Я говорю по телефону. Легче оставить комментарий, чем ответ
@charlietfl Нет ошибки, это просто неопределено, когда я определяю ее вне обратных вызовов.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как упоминал @Doug, вы должны передать global в пользовательскую переменную следующим образом:
global.user = ...
По сути, этот процесс превращает user в глобально доступную переменную. Вы можете узнать больше о Node global здесь, чтобы понять, что он делает, а также понять, каковы его последствия: http://stackabuse.com/using-global-variables-in-node-js/
Нет, не следует использовать глобальную переменную. Константы на уровне модуля должно быть достаточно.
@Bergi согласился. Это также упоминается в приведенной мной ссылке. Но они также показали, в каких ситуациях может потребоваться использование глобальной переменной.
Да, я просто говорю, что это не одна из этих ситуаций.
Это сделает мою переменную пользователя доступной во всех модулях, верно? Я не хочу этого, я хочу, чтобы он был доступен в обратных вызовах того же модуля. Этого не происходит, потому что обратные вызовы говорят, что переменная пользователя не определена.
С точки зрения @charloetfl, если он находится внутри файла, следует объявить его вне обратного вызова или поверх файла. Если мы говорим о доступе ко всем модулям и файлам в проекте, то добавление его к глобальному объекту - это способ сделать это в узле, как упоминалось в @doug и @andrewl.
Объявление пользователя вне приводит к тому, что функции обратного вызова сообщают, что переменная пользователя не определена.
Поскольку использование global также не рекомендуется при разработке узлов, я бы рекомендовал изучить возможность создания переменной User в app.locals, чтобы она была доступна в вашем объекте req через req.app.locals, как описано в expressjs.com/en/api.html#app.locals. Надеюсь это поможет.
нет причин, по которым он не должен быть доступен при объявлении вне обратных вызовов. Какие ошибки возникают?