使用.then函数时,页面不会加载

时间:2017-07-29 16:18:08

标签: javascript node.js mongoose mongoose-schema

我一直在研究一个项目,它要求我在数据库中创建模式后使用.then函数但出于某种原因,每次我尝试在.then()中运行res.render函数功能,页面不加载。它告诉我我的应用程序正在端口上运行,我连接到我的数据库,一切似乎都很好。我正在使用cloud9,这是我的index.js文件的代码

function getVenues (bars){
        bars.map((eachBar) => {
            Venue.findOne({
                id: eachBar.id,
                title: eachBar.name,
                image: eachBar.image_url,
                url: eachBar.url,
                rating: eachBar.rating
            }, (err, venue) => {
                if(err) return (err);
                if(!venue){
                    var newVenue = new Venue({
                        id: eachBar.id,
                        title: eachBar.name,
                        image: eachBar.image_url,
                        rating: eachBar.rating,
                        url: eachBar.url
                    }).save((err, venue) => {
                        if(err) return err;
                    })
                }
            })
        })
}


router.get('/', function (req, res) {
res.header('Access-Control-Allow-Credentials', true);
request.get('http://ipinfo.io/' + req.headers['x-forwarded-for'], {json: true}, function (e, r){
    client.search({
        term: "bars",
        latitude:r.body.loc.split(",")[0],
        longitude: r.body.loc.split(",")[1]
    }).then(response => {
        getVenues(response.jsonBody.businesses).then(function(results){
                res.render('home', {
                    bars: results,
                    term: 'Bars near you',
                    authenticated: req.isAuthenticated()
                });
                console.log(results);
            });
        console.log(req.isAuthenticated());
    });
});
});

一切都已定义,并且我的代码中没有显示任何错误。这里的问题是,如果我将res.render函数放在.then函数之外,它的工作完全正常并且所有内容都会加载,但是现在,它只是继续加载并且给出了Error 502 - Bad Gateway的错误在cloud9网站上。有谁知道它为什么会发生以及如何解决它?

1 个答案:

答案 0 :(得分:1)

问题是,您的函数getVenues没有返回Promise来定义thencatch。要获得一系列场地,您需要结合每个Venue.findOne调用的结果。这可以通过在内部'内部数组上使用Promise.all来完成。承诺:

return Promise.all(bars.map(bar => {
    return Venue.findOne({...})
}))

这假设Venue.findOne返回值(或再次为Promise)。这很容易,如果findOne已经返回Promise(应该像上面那样工作),但如果它只使用回调,则如下工作:

Venue.findOne({...}, (err, venue) => {
    if (err) return (err)
    if (venue) return venue
    return new Promise((fulfil, reject) => {
        let newVenue = new Venue({...})
            .save((err, venue) => {
                 if (err) reject(err)
                 else fulfil(venue)
            })
    })

Promise可能会返回错误。对于您使用的每个承诺,您应添加catch。只需在每个catch(或最后一个then的结束括号后面添加一个then,如果 - 通常 - 你有一连串的thens),你应该看到发生了哪个错误:< / p>

client.search(...)
    .then(...)
    .catch(error => {
        console.log(error)
    })