2017-02-19 60 views
-2

我很难理解工作如何承诺,我试着用express创建承诺,在mysql上查询并获得结果。我读到,让这个同步并不酷。我正在尝试做一个小游戏,这条路线是为了注册。Nodejs + express promisse

var lang = require('../lang.js'); 
var config = require('../config.js'); 
var fieldValidator = require('../libs/field_validator'); 
var microtime = require('microtime'); 
var crypto = require('crypto'); 
//Presets 
var lang = new lang(); 
var rlang = lang.returnMessage; 
var fieldValidator = new fieldValidator(); 
var moment = require('moment'); 

module.exports = function(app, my){ 
    //Primeiro os registros 
    /// Account Register 
    //// 
    var check_username = function(username){ 
     return new Promise(function(resolve, reject) { 
      my.query('SELECT username FROM 4h_users WHERE ?', username, function (error, result, fields) { 
       if (error) { 
        reject({"status": "error", "code":10 ,"message": rlang(lang, 10)}); 
       }else{ 
        if(result.lenght > 0){ 
         reject({"status": "error", "code":10 ,"message": rlang(lang, 10)}); 
        }else{ 
         resolve(true); 
        } 
       }; 
      }); 
     }); 
    } 
    check_username().then(function(id_user) { 
     console.log(value); 
    }, function(reason) { 
     res. 
    }); 


    app.post('/api/usuario/registrar', function(req, res){ 
     if(!req.body.lang){ 
      return res.send({"status": "error", "code":1 ,"message": 'Blank Language'}); 
     }else{ 
      var lang = req.body.lang; 
     } 
     if(!req.body.recode){ 
      return res.send({"status": "error", "code":4 ,"message": rlang(lang, 4)}); 
     }else if(!req.body.username){ 
      return res.send({"status": "error", "code":1 ,"message": rlang(lang, 1)}); 
     }else if(!req.body.password){ 
      return res.send({"status": "error", "code":3 ,"message": rlang(lang, 3)}); 
     }else if(!req.body.email){ 
      return res.send({"status": "error", "code":5 ,"message": rlang(lang, 5)}); 
     }else if(req.body.reemail != req.body.email){ 
      return res.send({"status": "error", "code":6 ,"message": rlang(lang, 6)}); 
     } 

     my.query('SELECT email FROM 4h_users WHERE ?', req.body.email, function (error, result, fields) { 
      if (error) { 
       return res.send({"status": "error", "code":10 ,"message": rlang(lang, 10)}); 
      }else{ 
       return res.send({"status": "error", "code":13 ,"message": rlang(lang, 13)}); 
      }; 
     }); 

     if(!fieldValidator.username.isValid(req.body.username)){ 
      return res.send({"status": "error", "code":9 ,"message": rlang(lang, 9)}); 
     }else if(!fieldValidator.email.isValid(req.body.email)){ 
      return res.send({"status": "error", "code":7 ,"message": rlang(lang, 7)}); 
     }else if(!fieldValidator.password.isValid(req.body.password)){ 
      return res.send({"status": "error", "code":8 ,"message": rlang(lang, 8)}); 
     } 

     var ip = generate_ip(); 
     var salt = crypto.createHash('sha256').update(microtime.now()+req.body.username).digest("hex"); 
     var password = crypto.createHash('sha512').update(salt+req.body.password).digest("hex"); 

     var user = { 
      username: req.body.username, 
      email: req.body.email, 
      password: password, 
      salt: salt, 
      token_expiration: microtime.now(), 
      money: config.default_bonus.money, 
      hcoins: config.default_bonus.hcoins, 
      register_date: moment().format('YYYY-MM-DD HH:mm:ss'), 
      token: crypto.createHash('sha256').update(microtime.now()+req.body.username).digest("hex"), 
      token_expiration: microtime.now()+config.expiration.login, 
      offline_mode_expiration: 0 
     }; 

     //Check if machine ip exists and generate another one 
     check_ip_status(my, ip); 

     // Time to mysql 

     //Add new user to mysql 
     my.query('INSERT INTO 4h_users SET ?', user, function (error, result, fields) { 
      if (error) { 
       console.log(error); 
       return res.send({"status": "error", "code":10 ,"message": rlang(lang, 10)}); 
      }else{ 
       var machine = { 
        ip: ip, 
        id_user: result.insertId 
       }; 
       //Add new machine to mysql 
       my.query('INSERT INTO 4h_machines SET ?', machine, function (error, result, fields) { 
        if (error) { 
         console.log(error); 
         return res.send({"status": "error", "code":10 ,"message": rlang(lang, 10)}); 
        }else{ 
         return res.send({"status": "success", "code":11 ,"message": rlang(lang, 11)}); 
        }; 
       }); 
      }; 
     }); 
    }); 
} 


function generate_ip(){ 
    return (Math.floor(Math.random() * 254) + 1) + "." + (Math.floor(Math.random() * 254) + 1) + "." + (Math.floor(Math.random() * 254) + 1) + "." + (Math.floor(Math.random() * 254) + 1); 
} 
function check_ip_status(my, ip){ 
    my.query('SELECT ip FROM 4h_machines WHERE ?', ip, function (error, result, fields) { 
     if (error) { 
      return res.send({"status": "error", "code":10 ,"message": rlang(lang, 10)}); 
     }else{ 
      if(result.lenght > 0){ 
       ip = generate_ip(); 
       check_ip_status(ip); 
      } 
     }; 

    }); 
} 
//id_user, username, salt, password, email, avatar_url, 4h_coins, money, last_login, register_date, token, token_expiration, reputation, actions, email_verify, modo_offline_expiration 

,如果您有其他提示此代码,请告诉我,我在学习和任何帮助是我 感谢

+0

你应该总是等待MySQL查询结果。因此将代码分成几块。请阅读此页面; https://blog.risingstack.com/asynchronous-javascript/ –

+1

您似乎试图向此请求发送多个回复。当你执行'my.query()',然后在响应中有一个if/else时,你可以用'res.send()'发送一个响应,以获得所有可能的结果。然后,你在函数的后面也有'res.send()'。你不能那样做。您只发送一个响应每个请求。所以,这里的逻辑流程是错误的。另外,你需要在'my.query()'回调中继续处理,而不是在它之后。 – jfriend00

回答

2

非常有用的,如果你有这个代码,请告诉另一个秘诀我,我正在学习和任何帮助对我非常有用,谢谢

这是一个非常普遍的问题,可以概括为:我如何了解承诺。有约承诺在Stack Overflow上的问题和答案,我可以推荐很多