我一直在研究一个项目,它要求我在数据库中创建模式后使用.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网站上。有谁知道它为什么会发生以及如何解决它?
答案 0 :(得分:1)
问题是,您的函数getVenues
没有返回Promise
来定义then
和catch
。要获得一系列场地,您需要结合每个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)
})