Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用.then函数时不加载页面_Javascript_Node.js_Mongoose_Mongoose Schema - Fatal编程技术网

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

Javascript 使用.then函数时不加载页面,javascript,node.js,mongoose,mongoose-schema,Javascript,Node.js,Mongoose,Mongoose Schema,我一直在处理一个项目,它要求我在数据库中创建架构后使用.then函数,但由于某种原因,每次我尝试在.then()函数中运行res.render函数时,页面都不会加载。它告诉我我的应用程序正在端口上运行,我已连接到数据库,一切似乎都很好。我正在使用cloud9,下面是我的index.js文件代码 function getVenues (bars){ bars.map((eachBar) => { Venue.findOne({

我一直在处理一个项目,它要求我在数据库中创建架构后使用.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函数之外,它工作得非常好,所有东西都加载了,但是现在,它只是继续加载,并在cloud9站点中给出了一个错误
error 502-Bad Gateway
。有人知道它为什么会发生以及如何解决吗?

问题是,您的函数
GetVinces
没有返回一个
承诺
,该承诺将定义
然后
捕获
。要获得场馆数组作为结果,您需要组合每个
vention.findOne
调用的结果。这可以通过使用
Promise来实现。“内部”Promise数组中的所有

return Promise.all(bars.map(bar => {
    return Venue.findOne({...})
}))
这假设
vention.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)
            })
    })
承诺可能会返回错误。对于您使用的每个承诺,您应该添加一个
catch
。只需在每个
然后
的右括号后添加一个
捕捉
(或最后一个
然后
如果-通常-您有一个串联的then),您应该看到发生了哪种错误:

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

当访问APIThank@Joachim Schirrmacher时出现错误,您应该添加一个.catch来触发该函数。然后未定义该函数。你知道我可以用什么替代品来做“then”部分吗?哦,我一开始没看到。第二个
then
调用是在
getVanues
函数的返回值上,该函数不返回一个
Promise
,它将定义一个
then
函数。您需要返回一个,由
findOne
结果的结果组成。我要更改答案中的密码。我现在知道了!我在函数的开头添加了
returnnewpromise
,现在它可以工作了!非常感谢!