【问题标题】:Is there a way to be more concise when using classMethods in Sequelize?在 Sequelize 中使用 classMethods 时有没有更简洁的方法?
【发布时间】:2017-02-22 05:34:55
【问题描述】:

我有一个模型intent,它与conditionslinksnodes 有一个hasMany 关联。 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)
                    })
                })
            })
        })
    })
})

【问题讨论】:

    标签: javascript express sequelize.js


    【解决方案1】:

    我认为你完全错过了options 方法对象中的include 的概念,例如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

    【讨论】:

    • 你的方法更好。
    • 哦,哇,我想我被自动生成的功能蒙蔽了双眼。这是完美的,谢谢。
    【解决方案2】:

    您可以使用Promise.all() 等待所有的promise 被解决,然后对数据做一些事情。

    以下是部分示例,可帮助您走上正轨:

    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])
                ...
            })
        })
    })
    

    【讨论】:

    • 这似乎好多了,除了异化的 resolvedPromises 数组。我会实现的,干杯。
    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多