2017-08-05 93 views
-1

這裏我試圖做的是檢查是否有用戶名和電子郵件匹配在數據庫中,如果沒有,請註冊一個新用戶。使用coffescript。Node.js Http POST永遠掛在mysql查詢

當我嘗試做一個POST到路由,摩根打印

POST /註冊 - - 質譜 - -

而且永遠郵遞員掛...

有沒有控制檯錯誤,沒有POSTMAN響應...

任何人有任何想法是什麼造成的問題?

app.post '/register', (req, res, next) -> 
    email = req.body.email 
    username = req.body.username 
    emailORUsernameExists = checkEmailUsername email, username 

    unless emailORUsernameExists 
    password = req.body.password 
    query = "INSERT INTO users (email, username, password) VALUES (" + email + "," + username + "," + password + ")" 
    bcrypt.genSalt 10, (err, salt) -> 
     bcrypt.hash password, salt, (err, hash) -> 
     # Store hashed password in DB. 
     connection.query query, (err, result) -> 
      if err 
      throw err 
      console.log "1 record inserted!" 

checkEmailUsername = (mail, user) -> 
    query = "SELECT * FROM users WHERE email = ? OR username = ?" 
    connection.query query, [mail, user], (err, row, fields) -> 
    if err 
     console.log err 

    if row.length > 0 
     # return true if there is a matching username and password 
     return true 
    else 
     # if there is not, return false 
     return false 

此外,JS版本

app.post('/register', function(req, res, next) { 
    var email, emailORUsernameExists, password, query, username; 
    email = req.body.email; 
    username = req.body.username; 
    emailORUsernameExists = checkEmailUsername(email, username); 
    if (!emailORUsernameExists) { 
     password = req.body.password; 
     query = "INSERT INTO users (email, username, password) VALUES (" + email + "," + username + "," + password + ")"; 
     return bcrypt.genSalt(10, function(err, salt) { 
     return bcrypt.hash(password, salt, function(err, hash) { 
      return connection.query(query, function(err, result) { 
      if (err) { 
       throw err; 
      } 
      return console.log("1 record inserted!"); 
      }); 
     }); 
     }); 
    } 
    }); 

    checkEmailUsername = function(mail, user) { 
    var query; 
    query = "SELECT * FROM users WHERE email = ? OR username = ?"; 
    return connection.query(query, [mail, user], function(err, row, fields) { 
     if (err) { 
     console.log(err); 
     } 
     if (row.length > 0) { 
     return true; 
     } else { 
     return false; 
     } 
    }); 
    }; 

回答

0

res是從來沒有,這導致在請求掛代碼的任何地方調用。

更先進的方法對你的代碼看起來像下面這樣:以上

app.post('/register', async (req, res, next) => { 
    const { email, username } = req.body 

    // Since our function now returns a Promise we can use await. 
    // Avoids that triangle of doom/callback hell. 
    const emailORUsernameExists = await checkEmailUsername(email, username) 

    if (!emailORUsernameExists) { 
    let { password } = req.body 

    // Hash the password BEFORE saving to the database 
    const salt = await bcrypt.genSalt(10) 
    password = await bcrypt.hash(password, salt) 

    const query = `INSERT INTO users (email, username, password) VALUES (${email}, ${username}, ${password}` 

    connection.query(query, (err, result) => { 
     if (err) { 
     // Something went wrong, let the client know this. 
     res.status(500).json({ error: err }) 
     return 
     } 
     // All went well. 
     res.status(201).json() 
    }) 
    } 
}) 

function checkEmailUsername (mail, user) { 
    const query = 'SELECT * FROM users WHERE email = ? OR username = ?' 

    // I don't think node-mysql supports Promises. 
    // Promise is used to make the code read more synchronous 
    return new Promise((resolve, reject) => { 
    connection.query(query, [mail, user], (err, row, fields) => { 
     if (err) { 
     reject(err) 
     } 
     if (row.length > 0) { 
     resolve(true) 
     } else { 
     resolve(false) 
     } 
    }) 
    }) 
} 

的代碼是未經測試,所以你需要將其調整爲適合您的需求。