gpt4 book ai didi

node.js - Option.order 在传递给类方法时被破坏

转载 作者:行者123 更新时间:2023-12-03 22:32:47 25 4
gpt4 key购买 nike

背景

Error: Order must be type of array or instance of a valid sequelize method
我以为我已经解决了这个问题,但结果我又搞砸了这个错误。
我正在尝试使用类方法来计算模型的一些属性。
假设这是模型 A。
模型 A 与模型 B 相关联。因为我在使用数组参数时为模型 B 生成正确的列名时遇到问题。
我打算通过使用 sequelize.literal() 来绕过这个问题。

图案
  • 给Model A做一个类方法(很多业务层都用到这个功能,所以不能拿走)
  • 该方法的原型(prototype)是Model.function(options) .此选项对象在方法函数内部进行验证,如果它需要以某种方式进行突变。
  • 已验证的选项对象被传递给 Model.findAll(options)

  • 我正在实现这个解决方案,如下面的代码
    路由器
    const sequelize = require('sequelize')
    const { ModelA } = require('../models')
    ...
    router.get('/', ..., async (req, res, next) => {
    try {
    ...
    if(page < lastpage + 1){
    const products = await ModelA.classMethod({
    subquery : false,
    include: [
    ...
    ],
    ...
    order : sequelize.literal(`"Product.rating" DESC`)
    })

    ...
    }
    ...
    } catch (e) {
    ...
    }
    })
    类方法
    ModelA.classMethod = async function(options){
    const sequelize = require('sequelize')
    const { ModelB } = require('.')

    let { include, where, order, limit, offset, product } = options
    ...

    const items = await ModelA.findAll({
    subquery: false,
    include: [
    {
    model: ModelB,
    as: 'ModelB',
    required: true,
    where: product.where,
    include: include
    }
    ],
    where: where,
    limit: limit,
    order: order
    })

    ...
    }
    奇怪的事情正在这里发生。传递参数时(模式 3),出现错误 Error: Order must be type of array or instance of a valid sequelize method这个错误似乎是因为传递的选项无效 sequelize.literal()但实际上我通过的只是 sequelize.literal(`'Product.name' DESC`) ,这里没有突变。
    所以我试图弄清楚我的文字有什么问题。
    let { order } = option

    console.log(order)//Literal { val: "'Product.rating' DESC" }
    console.log(order instanceof sequelize.Utils.SequelizeMethod)//false

    if(!order) order = null

    console.log(order)//Literal { val: "'Product.rating' DESC" }

    ModelA.findAll({ ..., order : order })

    console.log('good!!!')//I want to see this log
    订单本身看起来不错,但我认为原型(prototype)的某个地方坏了。
    最奇怪的部分是如果我将订单替换为 sequelize.literal(`'Product.name' DESC`),这与我传递给 classMethod 参数的内容相同,发生了某种魔术并且错误消失了。
    const sequelize = require('sequelize')
    let order = sequelize.literal("'Product.rating'")

    console.log(order)//Literal { val: "'Product.rating' DESC" }
    console.log(order instanceof sequelize.Utils.SequelizeMethod)//true!!

    if(!order) order = null

    ModelA.findAll({ ..., order : order })

    console.log('good!!!')//I see this log and I can finally rest in peace.

    如果有人像我一样有类似的问题,请您分享一些解决此问题的见解吗?到目前为止,我尝试如下。
  • 将路由器 sequelize 实例传递给类方法。 console.log(order instanceof sequelize.Utils.SequelizeMethod)//true 所以似乎没有破坏实际查询没有以某种方式执行。
  • 静态添加order : sequelize.literal("'Product.rating' DESC") :工作完美,但在生产中无用。此选项应该是动态的,以便用户可以控制它。
  • 最佳答案

    我的坏奇怪的不是错误,而是我在应用程序和项目根目录之间使用了不同的版本。此问题是由 引起的嵌套目录的版本问题 .

    /* MY PROJECT STRUCTURE */

    project
    |
    |--api (sequelize 5.22)
    |
    |--auth
    |
    |--batch
    |
    |-- models (sequelize 6.3)

    最近,我将 sequelize 从 5.22 升级到 6.3,同时这样做,我错过了升级应用程序的 sequelize。所以根和应用程序之间的版本是不同的。由于 sequelize 正在迁移到 typescript,因此 6.0 和 5.22 的 sequelize 内部类型必须不同。 Error: Order must be type of array or instance of a valid sequelize method所以,这个错误是足够合理的,但我现在无法理解。有很多建议不要在嵌套目录中安装相同的模块。我应该仔细听他们的。

    但是,使用数组排序(例如 > [model, 'column', 'type'] )给了我错误的查询并最终导致未知列错误。

    关于node.js - Option.order 在传递给类方法时被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65303310/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com