【问题标题】:How to setup sequelize orm in nodejs如何在nodejs中设置sequelize orm
【发布时间】:2016-04-15 17:57:08
【问题描述】:

在模型中:

var Sequelize = require('sequelize');
var sequelize_config = {
      "username": process.env.DB_USERNAME || "root",
      "password": process.env.DB_PASSWORD || "",
      "pool": 200,
      "database": "faasos_platform", 
      "host": "localhost",
      "dialect": "mysql",
      "dialectOptions": {
        "multipleStatements": true
      },
      "logging": true,
      "define": {
        "timestamps": true,
        "underscored": true
      }
    }

var sequeliz = new Sequelize(sequelize_config.database, sequelize_config.username, sequelize_config.password, sequelize_config);

module.exports = function (sequeliz, DataTypes) {
  var auth = sequeliz.define("auth", {
    device_id: {
      type: DataTypes.STRING(50),
      validate: {
        notEmpty: true
      }
    },
    customer_id: {
      type: DataTypes.INTEGER,
      validate: {
        notEmpty: true
      }
    },
    created_at: {
      type: DataTypes.DATE,
      validate: {
        notEmpty: true
      }
    },
    access_token: {
      type: DataTypes.STRING(455),
      validate: {
        notEmpty: true
      }
    },
    ip_address: {
      type: DataTypes.STRING(20),
      validate: {
        notEmpty: true
      }
    },
    is_active: {
      type: DataTypes.INTEGER,
      validate: {
        notEmpty: true
      }
    }
  }, {
    classMethods: {
      associate: function (models) {},
      verify_user: function (req, callback) { 
        var d = new Date();
        var sql = " Select customer_id From auth WHERE access_token =:access_token && is_active = '1' ";
        sequelize.query(sql, {
          replacements: { 
            access_token: req.access_token 
          },
          raw: true
        }).spread(function (data, metadata) {
          callback(null, data);
        }).catch(function (err) {
          callback(err, null);
        });  
      },
      revoke_access_token: function (req, callback) {  
        var sql = "UPDATE  auth SET is_active = 0 " +
          "WHERE customer_id = :customer_id";
        sequelize.query(sql, {
          replacements: { 
            customer_id: req.id
          },
          raw: true
        }).spread(function (data, metadata) {
          callback(null, data);
        }).catch(function (err) {
          callback(err, null);
        }); 
      },
      save_access_token_details: function (req, callback) { 
        var d = new Date();
        var sql = "INSERT INTO auth (device_id, customer_id, created_at, access_token, ip_address, is_active)" +
          "VALUES (:device_id, :cust_id, :created_at, :access_token, :ip_add, 1) ";
        sequelize.query(sql, {
          replacements: {
            device_id: req.device_code ,
            cust_id: req.id ,
            created_at: d,
            access_token: req.access_token,
            ip_add: req.ip_add  
          },
          raw: true
        }).spread(function (data, metadata) {
          callback(null, data);
        }).catch(function (err) {
          callback(err, null);
        });; 
      }
    },
    tableName: 'auth',
    timestamps: true,
    underscored: true
  });
  return auth;
};

在我的控制器中:

var models = require('../models/auth.js'); // the above model is saved in file auth.js

models.auth.verify_user(access_token, function (err, data) {
        if (err) {
          res.status(401).send({
            'err': 'Unauthorized!'
          });
        }
        if (data) {
          models.revoke_access_token(user, function (err, data) {
            if (err) {
              res.status(401).send({
                'err': 'Unauthorized!'
              });
            }
          });
        }
        models.save_access_token_details(payload, function (err, data) {
          if (err) {
            res.status(401).send({
              'err': 'Unauthorized!'
            });
          } else {
            console.log(err, data);
            res.send(data);
          }
        });
      });

但每次都存在错误::

TypeError:无法调用未定义的方法“verify_user” 在SignStream。 (/home/salim/Documents/proj/platform/oAuth/controllers/validate.js:25:19) 在 SignStream.EventEmitter.emit (events.js:95:17) 在 SignStream.sign (/home/salim/Documents/proj/platform/oAuth/node_modules/jsonwebtoken/node_modules/jws/lib/sign-stream.js:54:8) 在SignStream。 (/home/salim/Documents/proj/platform/oAuth/node_modules/jsonwebtoken/node_modules/jws/lib/sign-stream.js:37:12) 在 DataStream.g (events.js:180:16) 在 DataStream.EventEmitter.emit (events.js:92:17) 在数据流。 (/home/salim/Documents/proj/platform/oAuth/node_modules/jsonwebtoken/node_modules/jws/lib/data-stream.js:20:12) 在 process._tickCallback (node.js:415:13) 流.js:94 投掷者; // 管道中未处理的流错误。 ^ 错误:读取 ECONNRESET 在 errnoException (net.js:901:11) 在 Pipe.onread (net.js:556:19)

请帮忙看看我哪里出错了??为什么orm无法识别功能???

【问题讨论】:

  • 您的方法似乎“嵌套”到了 classMethods 属性中。那么,您是否尝试将其称为 models.auth.classMethods.verify_user?
  • @DomenicoVacchiano,models.auth 未定义,这就是问题所在,所以您不能调用 models.auth.classMethods.verify_user。

标签: node.js orm sequelize.js


【解决方案1】:

你的问题是在你初始化models之后models.authundefined。因为models.authundefined,所以不能调用它的函数,也不能使用它的成员。

authmodule.exports 中的一个局部变量。即使您将其归还,但在其范围之外您也无法使用它。

如果require 调用module.exports,那么您的modelsauth 是完全相同的对象,因为您返回了auth,因此models.verify_user 存在于您的代码中。但是,我建议进行以下修复:

var models = {}; //creating an empty object which will hold the models
models.auth = require('../models/auth.js'); // the above model is saved in file auth.js

然后你就可以使用models.auth了。

【讨论】:

  • 哇。 js 绝对是最容易被误解的语言。没有。 undefined 仍然是未定义的。即使你给它一个新的包装器。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2016-01-29
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多