2.註冊-Node部分

有登入怎麼可能沒有註冊對吧。

exports.postSignUp = function (req, res, next) {
  var user = {
    email: req.body.email,
    name: req.body.name.trim(),
    password: req.body.password,
    password_confirmation: req.body.password_confirmation,
    current_sign_in_ip: req.ip                    //last
  };

  if (!validator.isEmail(user.email)){
    return res.status(401).json({
      info: 'invalid Email',
      data: {}
    });
  }
  if (string_validator.isEmpty(user.name)){
    return res.status(401).json({
      info: 'blank name',
      data: {}
    });
  }
  if(!user.password === user.password_confirmation){
    return res.status(401).json({
      info: 'password not match',
      data: {}
    });
  }
  delete user.password_confirmation

  Users.forge().query({
      where: {
        email: req.body.email
      }
    }).fetchOne().then(function (existingUser) {
      if (existingUser) {
        return res.status(401).json({
          info: 'Account with that email address already exists',
          data: {}
        });
      }
      Users.forge().create(user).then(function (user) {
        var token = jwt.encode({ id: user.attributes.id}, tokenSecret);
        return res.json({ token : token,user: user.toJSON() });
      }).catch(function (err) {
        return next(err);
      });
    });
};

app.post('/api/signup', auth.postSignUp);

前半段要對進來的值(email,password等)做一些判斷,判斷完沒問題當然就是塞進資料庫,但在塞進資料庫前其實有做加密的動作
這裡以bcrypt做加密,在create(user)時會執行到。

setDefaultAndHashPassword: function (model, attrs, options) {
    return new Promise(function (resolve, reject) {
      bcrypt.genSalt(10, function (err, salt) {
        bcrypt.hash(model.attributes.password, salt, function (err, hash) {
          if (err) reject(err);
          delete model.attributes.password;
          model.set('encrypted_password', hash);
          resolve(hash); // data is created only after this occurs
        });
      });
    });
  }

結果也傳回jwt token,註冊沒問題會順便登入。