2017-01-21 7 views
0

У меня есть 2 схемы: Blogdemo и обзор. Оба в том же файле: landing.ejs Я хочу, чтобы содержимое обеих схем отображалось на целевой странице.Несколько обратных вызовов в экспресс

Код:

app.get('/', function (req, res,next) { 
     Blogdemo.find({}).sort([['_id', -1]]).limit(3).exec(function(err,allBlogs) { //finds the latest blog posts (upto 3) 
     if(err) { 
      console.log(err); 
     } else { 
      res.render("landing", {blog : allBlogs , moment : now}); 
     } 
    }) 
    next(); 
    }, function (req, res) { 
     Review.find({}).sort([['_id', -1]]).limit(3).exec(function(err,allReviews) { //finds the latest reviews (upto 3) 
       if(err) { 
        console.log(err); 
       } else { 
        res.render("landing", {review : allReviews, moment : now}); 
       } 
    }) 
}) 

Я получаю ошибку: "обзор не определен". Если я изменю порядок обратных вызовов, я получаю ошибку: «блог не определен». Я понимаю, что с обратными вызовами что-то не так.

Я просмотрел экспресс-документы и использовать это:

app.get('/', function (req, res, next) { 
    console.log('Request URL:', req.originalUrl) 
    next() 
}, function (req, res, next) { 
    console.log('Request Type:', req.method) 
    next() 
}) 

Это работает perfectly.But я после точного рисунка, и это не работает. Что я делаю не так?

+0

@MukeshSoni 4.14.0 – eknoor4197

+0

попробуйте переместить следующий() справа после еще блок в обратном вызове –

+0

@AsifSaeed Не работает. – eknoor4197

ответ

1

Из того, что я вижу, вы делаете одну вещь неправильно: размещение next() за пределами области async.

Попробуйте это:

app.get('/', function(req, res, next) { 
     Blogdemo.find({}).sort([ 
      ['_id', -1] 
     ]).limit(3).exec(function(err, allBlogs) { //finds the latest blog posts (upto 3) 
      if (err) next(err); 
      res.locals.blog = allBlogs; 
      res.locals.moment = now; 
      next(); 
     }) 
    }, function(req, res) { 
     Review.find({}).sort([ 
      ['_id', -1] 
     ]).limit(3).exec(function(err, allReviews) { //finds the latest reviews (upto 3) 
      if (err) return next(err); 
      res.locals.review = allReviews; 
      res.render("landing", res.locals); // 2nd argument is optional. 
     }) 
    }) 
+0

Я хочу колонку для блога, 1 для отзывов, что-то вроде этого: News: [Статья 1], [Статья 2], [3] Статья Отзывы: [Review 1], [Review 2], [Review 3] – eknoor4197

+0

Это сработало! Большое спасибо! Итак, что мы делаем, это хранить переменные в res.locals и использовать оттуда? Должен ли следующий() по-прежнему нужен? – eknoor4197

+0

Да, это так. Я предлагаю вам прочитать экспресс-документы: https://expressjs.com/ru/guide/writing-middleware.html –

1

Я думаю, что вы делаете неправильно это rendering же странице 2 раза res.render и прохождение одной из двух переменных каждый раз, поэтому другой приходят как неопределенные.

Вы должны render на landing страницу в последнем callback, и просто передать variables от первого callback на второй.

Чтобы передать переменные из одного обратного вызова в другой, вы можете использовать res.locals.

Кроме того, вы должны положить next() внутри обратного вызова find. так что он правильно передает переменную в следующий обратный вызов.

Попробуйте это:

app.get('/', function (req, res,next) { 
     Blogdemo.find({}).sort([['_id', -1]]).limit(3).exec(function(err,allBlogs) { //finds the latest blog posts (upto 3) 
     if(err) { 
      console.log(err); 
      next(); 
     } else { 
      //set variable in `res.locals` and pass to next callback 
      res.locals.blog = allBlogs; 
      next(); 
     } 
    }) 
}, function (req, res) { 
     Review.find({}).sort([['_id', -1]]).limit(3).exec(function(err,allReviews) { //finds the latest reviews (upto 3) 
       if(err) { 
        console.log(err); 
       } else { 
        allBlogs = res.locals.blog; 
        res.render("landing", {blog : allBlogs ,review : allReviews, moment : now}); 
       } 
    }) 
}) 

Для получения дополнительной информации о res.locals чтения Express res.locals documentation.

Надеюсь, это вам поможет!

+0

В остальном во втором обратном вызове это не должно быть: res.locals.review = allReviews; ? И если это так, не будет ли allBlogs определяться из-за проблемы с областью? – eknoor4197

+0

Нет, я не думаю, что это не создаст проблемы. –

+0

Эй, я вижу, что вы ответили на некоторые вопросы о монгодбе. Не могли бы вы мне помочь: http://stackoverflow.com/questions/41898336/mongodb-schema-defining – eknoor4197

Смежные вопросы