node.js: как передать несколько переменных в представление? - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь создать веб-страницу, где есть экземпляр всех текущих проектов, над которыми я работаю, слева, поэтому мне нужна функция .forEach (), чтобы просмотреть все из них вДля того, чтобы отобразить его, но с другой стороны, мне нужно отобразить информацию, которая в данный момент выбрана.

Пожалуйста, сначала взгляните на мой блок кода, чтобы я мог попытаться объяснить процесс мышления, стоящий за тем, что я пытался сделать.

Поэтому у меня не было проблем с выбором информации оединственный проект, который мне нужно было отобразить на этой веб-странице.Я использовал функцию .findOne (), чтобы выбрать нужную мне информацию.

Проблема, с которой я сталкиваюсь, заключается в том, что мне также нужно передать переменную, связанную с функцией .find (), чтобы пройти через все элементы базы данных.Я решил, что смогу определить определение allProjects, вручную запустив функцию .find (), а затем вернув ее, назначив Projects.find () для allProjects.

app.get('/projects/:url', (req, res) => {
    Projects.findOne({ Url: req.params.url }, (err, foundProject) => {
        if (err) {
            console.log(err);
        } else {
            res.render('show', {
                foundProject: foundProject,
                allProjects: Projects.find({}, (err, allProjects) => {
                    if (err) {
                        res.send('error');
                    } else {
                        return allProjects;
                    }
                })
            });
        }
    });
});

Я подумал, что, вернув allProjects и затем присвоив его всем allProjects, я смогу использовать переменную allProjects на моей странице show.ejs.

К сожалению, я получаю сообщение об ошибке «allProjects.forEach () не определено», что приводит меня к мысли, что в app.js, где я определяю allProjects, ему не присваивается правильное значение, которое я хочуэто назначено.

1 Ответ

1 голос
/ 19 мая 2019

Похоже, вы ожидаете, что return allProjects что-то сделает, но это на самом деле игнорируется.Если у вас нет функции обратного вызова, которую вы можете вызвать, она войдет в пустоту и никогда никем не будет видна.Это верно практически для всех функций обратного вызова.Они не заботятся о том, какое значение возвращает эта функция, потому что она никогда не актуальна, то, что они хотят, - это будущее значение, которое будет получено с помощью обратного вызова, переданного этой функции.1005 *

Чтобы исправить это, вам нужно переместить вызов render внутрь самой внутренней функции обратного вызова:

app.get('/projects/:url', (req, res) => {
  Projects.findOne({ Url: req.params.url }, (err, foundProject) => {
    if (err) {
        console.log(err);
        // Return here to avoid another level of indentation below
        return;
    }

    Projects.find({}, (err, allProjects) => {
      if (err) {
        res.send('error');
      } else {
        res.render('show', {
          foundProject: foundProject,
          allProjects:
        });
      }
    });
  });
});

Теперь это по-прежнему головокружительное количество кода, и вложение здесь становится полностьюиз-под контроля, хотя это относительно простой код Node.

Для сравнения приведу версию, которая использует async функции:

app.get('/projects/:url', async (req, res) => {
  let foundProject = await Projects.findOne({ Url: req.params.url });

  res.render('show', {
    foundProject: foundProject,
    allProjects: await Projects.find({})
  });
});

На самом деле в этом нет ничего особенного.То, что делает await, в основном останавливается на этой линии и ждет, пока обещание будет выполнено или произойдет ошибка.Любые ошибки должны быть зафиксированы с помощью try { ... } catch как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...