【问题标题】:Sequelize invalid value Symbol(ne)Sequelize 无效值 Symbol(ne)
【发布时间】:2018-05-02 22:41:28
【问题描述】:

我在 Express Node.js 服务器上运行以下两个文件:

home.js

var express = require('express')
var sequelize = require('sequelize')
var db = require('../../shared/db.js')

var op = sequelize.Op

var router = express.Router()

router.get('/home', function(req, res, next) {
    db.shared.person.findAll({
        where: {
            email: {
                [op.ne]: null
            }
        },
        order: ['id']
    }).then(function (person) {
        res.locals = {
            person: person
        }
        res.render('home')
    })
})

module.exports = router

db.js

var sequelize = require('sequelize')

var config = {
  host: 'localhost',
  port: 5432,
  username: '...',
  password: '...',
  database: 'postgres',
  dialect: 'postgres',
  operatorsAliases: false
}
var db = new sequelize(config)

module.exports = {
  shared: {
    person: db.define('person', {
      id: {
        type: sequelize.INTEGER,
        primaryKey: true
      },
      name: sequelize.STRING,
      email: sequelize.INTEGER
    }, { freezeTableName: true , timestamps: false, schema: 'shared' }),
  }
}

当我尝试运行此查询时,我收到错误声明 Unhandled rejection Error: Invalid value { [Symbol(ne)]: null }

我做错了什么?我可以使用$ne 甚至ne 都很好,但它们已被弃用并且使用起来并不完全安全。此外,不仅仅是[op.ne] - 当我使用这样的任何条件时,我会收到此错误。

我将这一切都基于guide,所以我不确定我在这里做错了什么。

【问题讨论】:

    标签: javascript node.js postgresql express sequelize.js


    【解决方案1】:

    db.jshome.js 中的 Sequelize 实例不同,这是因为 node 根据其路径缓存了所需的模块。

    要解决此问题,您可以在 db.js 中传递正确的实例

    module.exports = {
      shared: {
        person: db.define('person', {
          id: {
            type: sequelize.INTEGER,
            primaryKey: true
          },
          name: sequelize.STRING,
          email: sequelize.INTEGER
        }, { freezeTableName: true , timestamps: false, schema: 'shared' }),
      },
      db: db
    }
    

    然后最后使用该共享实例中的运算符进行查询

    var express = require('express')
    var sequelize = require('sequelize')
    var db = require('../../shared/db.js')
    
    var op = db.db.Op;
    
    var router = express.Router()
    
    router.get('/home', function(req, res, next) {
        db.shared.person.findAll({
            where: {
                email: {
                    [op.ne]: null
                }
            },
            order: ['id']
        }).then(function (person) {
            res.locals = {
                person: person
            }
            res.render('home')
        })
    })
    
    module.exports = router
    

    还有一件事,如果您正确清理用户输入,则字符串运算符的使用是完全安全的。如果您将未经处理的用户输入传递给 Sequelize 方法,则仅需要使用安全运算符。

    更多关于这个话题

    【讨论】:

    • 这非常有帮助,非常感谢!不过有一个问题:如何使用 Node.js/Express 清理用户输入?
    【解决方案2】:

    Unhandled rejection Error: Invalid value 如果您没有设置这样的字符串别名,也可能会出现:

    const Op = Sequelize.Op;
    const operatorsAliases = {
      $eq: Op.eq,
      $ne: Op.ne,
      ...
      $any: Op.any,
      $all: Op.all,
      $values: Op.values,
      $col: Op.col
    };
    
    const connection = new Sequelize(db, user, pass, { operatorsAliases });

    但是,最好从代码中删除基于字符串的别名并使用 [Op.ne],例如,Sequlize 计划很快弃用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2018-12-24
      • 2015-05-14
      • 1970-01-01
      相关资源
      最近更新 更多