2017-07-29 4 views
0

プロジェクトで作業していて、データベースにスキーマを作成した後に.then関数を使用する必要がありますが、何らかの理由でres.render関数.then()関数では、ページが読み込まれません。それは私のアプリがポートで実行されていると私のデータベースに接続されていると、すべてがうまくいくようだ。私はすべてが定義され、それが私のコードでエラーが表示されないされ .then関数を使用しているときにページが読み込まれない

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()); 
    }); 
}); 
}); 

をcloud9を使用して、ここでindex.jsファイルのための私のコードです

ています。ここで問題となるのは、関数を.then関数の外に置くと、それは完全にうまく動作し、すべてがロードされますが、今はロードを続けて、クラウド9サイトの Error 502 - Bad Gatewayというエラーになります。誰がなぜそれが起こり、それを解決する方法を知っていますか?

+0

:(あなたがthensのカスケードを持っている - - 一般的な場合または最後then)、あなたはどのエラーが発生見るべきちょうど各thenの閉じ括弧の後にcatchを追加あなたのAPIにアクセスする際にエラーが発生したときにトリガー – darham

答えて

1

問題は、あなたの関数getVenuesPromiseを返さないので、thencatchを定義することになります。結果として会場の配列を取得するには、それぞれのVenue.findOneコールの結果を組み合わせる必要があります。これは、「内部」のアレイ上Promise.allを使用して行うことができる約束:

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

これは、Venue.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) 
      }) 
    }) 

約束がエラーを返す場合があります:findOneが既に(上記のように動作するはずです)Promiseを返しますが、それが唯一のコールバックを使用する場合は、次のように動作する場合、これは、簡単です。使用する約束ごとに、catchを追加する必要があります。あなたが.catchを追加する必要があります

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

ありがとう@Joachim Schirrmacher、関数が判明しました。 .thenの部分に私が使うことができる選択肢はどれか知っていますか? –

+0

ああ、私はそれを最初に見なかった。 'then'呼び出しの2番目は' getVanues'関数の戻り値にあります。これは 'promise'を返しません。これは' then'関数を定義します。 'findOne'結果の結果で構成される1つを返す必要があります。私は答えのコードを変更します。 –

+0

私はそれを今得ました!私は機能の冒頭に「 ''新しいプロミスを返す ''」を付け加えました。本当にありがとう! –

関連する問題