2017-11-19 40 views
0

私は、ExpressのNode.jsサーバー上で実行されている次の2つのファイルがあります。Sequelize無効な値のシンボル(NE)

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に基づいているので、私はここで間違っている可能性はよく分かりません。

答えて

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メソッドに渡す場合は、安全な演算子を使用する必要があります。

このトピックの

もっと

+0

これはどうもありがとうございました、超便利でした!しかし、1つの質問:Node.js/Expressでユーザーの入力をどのように消毒するのですか? –

関連する問題