2017-02-22 6 views
1

私は、conditionslinksnodesに関連付けられたhasManyを持つモデルintentを持っています。 nodes自体もlinksに関連しています。SequelizeでclassMethodsを使用すると、より簡潔になる方法がありますか?

エクスプレスルートでは、すべての情報を1つのオブジェクトで取得したいと考えています。私が今やったやり方は、非常にコールバックで読めない。それはうまくいきますが、私はこのようなことを書く良い方法があると思っています。

app.get('/api/intents/:id', function(req, res) { 
    models.intent.findOne({ 
     where: { 
      id: req.params.id 
     } 
    }) 
    .then(function(intent) { 
     intent.getConditions() // call generated function from intent model for conditions 
     .then(function(conditions) { 
      intent.getLinks() // then call generated function from intent model for links 
      .then(function(links) { 
       intent.getNodes() // then call generated function from nodes model for links 
       .then(function(nodes) { 
        Promise.map(nodes, function(node) { 
         return node.getLinks() // Even deeper nested and getting out of hand 
         .then(function(links) { 
          node.setDataValue('links', links) 
         }) 
        }) 
        .then(function() { 
         intent.setDataValue('conditions', conditions) 
         intent.setDataValue('links', links) 
         intent.setDataValue('nodes', nodes) 
         res.json(intent) 
        }) 
       }) 
      }) 
     }) 
    }) 
}) 

答えて

2

私はあなたが完全にfindOneのような方法のoptions対象にincludeの概念を逃したと思います。ちょうど

models.intent.findById(req.params.id, { 
    include: [ 
     { model: models.condition }, 
     { model: models.link }, 
     { model: models.node, include: [ { model: models.link } ] 
    ] 
}).then((intent) => { 
    // here you get intent with conditions, links and nodes with links 
}); 

scopesをモデルに定義して使用することです。

+0

あなたの方がはるかに良い方法です。 –

+0

ああ、私は、私は自動生成された関数で盲目だったと思います。これは完璧です、ありがとう。 – Hyra

0

あなたは解決されるすべての約束を待つPromise.all()を使用して、データで何かを行うことができます。以下は

はトラックにあなたを得るために、部分的例である:

app.get('/api/intents/:id', function(req, res) { 
models.intent.findOne({ 
    where: { 
     id: req.params.id 
    } 
}) 
.then(function(intent) { 
    let promises = [] 

    promises.push(intent.getConditions()) 
    promises.push(intent.getLinks()) 
    promises.push(intent.getNodes()) 

    Promise.all(promises) 
    .then(function(resolvedPromises) { 
     Promise.map(resolvedPromises, function(node) { 
      intent.setDataValue('conditions', resolvedPromises[0]) 
      intent.setDataValue('links', resolvedPromises[1]) 
      ... 
     }) 
    }) 
}) 
+0

疎外されたresolvedPromises配列を除いてはるかに優れているようです。私はこれを実現させてくれるでしょう、歓声。 – Hyra

関連する問題