续订无效值符号(ne)

时间:2017-11-19 17:19:13

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

我在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,所以我不确定我在这里做错了什么。

2 个答案:

答案 0 :(得分:1)

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

要解决此问题,您可以在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方法,则只需使用安全运算符。

有关此主题的更多信息

答案 1 :(得分:0)

如果未设置像这样的字符串别名,也会出现

1

mov ax,1

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