在Sequelize中使用classMethods时有没有办法更简洁?

时间:2017-02-22 05:34:56

标签: javascript express sequelize.js

我的模型intenthasMany以及conditionslinksnodes关联。 nodes本身也与links有关联。

通过快速路线,我想在一个对象中获取所有信息。我现在这样做的方式是非常回调并且不可读。它有效,但我希望有更好的方法来写这些东西。

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 个答案:

答案 0 :(得分:2)

我认为你完全错过了include options方法对象findOne的概念。只需使用

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

答案 1 :(得分: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])
            ...
        })
    })
})