快递中的多个回调

时间:2017-01-21 06:19:10

标签: node.js express callback

我有2个架构:Blogdemo和Review。两者都在同一个文件中: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()
})

这完美无缺。但我遵循的确切模式并没有奏效。我做错了什么?

2 个答案:

答案 0 :(得分:1)

从我所看到的,你做错了一件事:将next()置于异步范围之外。

试试这个:

    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.
        })
    })

答案 1 :(得分: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}); } }) }) 的回调中。这样它就可以正确地将变量传递给下一个回调。

试试这个:

isInMultiWindowMode()

有关res.locals的更多信息,请阅读Express res.locals documentation

希望这能帮到你!