2016-11-22 4 views
0

У меня есть два файла:Sequelize - this.get()

server.js для получения запроса от клиента:

var db = require("./db.js"); 
app.post("https://stackoverflow.com/users/login", function (req, res) { 


    var body = _.pick(req.body, "email", "password"); 

    db.user.authenticate(body).then(function (data) { //data is entire record and use "authenticate" function instance 

     res.header("Auth", data.generateToken("authentication")).json(data); 
    }, function (e) { 
     res.status(401).send("Incorrect username or password! Please try again"); 
    }) 

user.js

........... 
instanceMethods: { 
      generateToken: function (type) { 
       if (!_.isString(type)) { 
        return undefined; 
       } 

       try { 
        //"this" is refer of istance sequelize "user" 
        var stringData = JSON.stringify({ id: this.get("id"), type: type }); 

        // encrypt json string "stringData" and we set a secret password for decrypt data 
        var encryptedData = crypto.AES.encrypt(stringData, "yyyy").toString(); 
        var token = jwt.sign({ 
         token: encryptedData 
        }, "xxxx"); 

        return token; 

       } catch (e) { 
        console.log(e); 
        return undefined; 
       } { 

       } 
      } 
     } 

Когда я вызываю data.generateToken из server.js, я использую объект db.user, который передает весь модуль от user.js. Но как он знает, что с this.get("id") должен взять идентификатор data записи? Какая связь между «этим» и «данным»? Важно: «данные» - это запись базы данных, которую я получил после управления учетными данными, отправленными от пользователя.

ответ

0

В вашем примере this относится к родительскому объекту, который определяет метод экземпляра, который в этом случае является экземпляром Sequelize, который - это объект ES6. Когда вы вызываете this.get(), вы вызываете функцию Instance.get(key, options) на конкретный экземпляр Instance.

Он получает User.id и включает в себя это значение в уникальном значении stringData, которое затем используется для генерации токена.

0

Хорошо тогда, если у меня есть в user.js:

var user = sequelize.define("user", { 
...... 

}, 

classMethods: { //for create simple methods 
      authenticate: function (body) { //pass body object from user.js (api users/login) into this class 
       return new Promise(function (resolve, reject) { //built a promise for send back the reject or resolve result 

        if (typeof body.email == "string" && typeof body.password == "string") { 

         user.findOne({ //search a specific element into database 
          where: { 
           email: body.email //where email into database is equals to email that you pass into JSON body 
          } 
         }).then(function (data) { //return entire record from the database 

          //compareSync permit that compare the original password with password hashed + salt (from the password_hash column from data table) 
          if (data && bcrypt.compareSync(body.password, data.get("password_hash"))) { 
           console.log("You are logged!"); 
           return resolve(data); 
}, 

instanceMethods: { 
      generateToken: function (type) { 
       if (!_.isString(type)) { 
        return undefined; 
       } 

       try { 
        //"this" is refer of istance sequelize "user" 
        var stringData = JSON.stringify({ id: this.get("id"), type: type }); 
}; 
return user; 

this.get это относится в пользовательской переменной? Затем, в API server.js, данные являются экземпляром пользовательской переменной, поэтому я могу получить доступ к методу generateToken и передать data объект, заменяющий this?

Смежные вопросы