Javascript 使用.then函数时不加载页面
我一直在处理一个项目,它要求我在数据库中创建架构后使用.then函数,但由于某种原因,每次我尝试在.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({
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
,现在它可以工作了!非常感谢!