2017-01-10 26 views
0

我想要做的是使用ajax發送一個post請求到服務器,並確保post請求不刷新頁面(使用e.preventDefault)。在服務器上,我想檢查用戶名或電子郵件是否被採用,如果沒有采取,然後自動登錄用戶,然後刷新頁面。問題是當我調用req.login並提交要登錄的數據時,它似乎沒有工作,但頁面仍在刷新。有任何想法嗎?req.login不記錄用戶

app.post('/signup', function (req, res) { 
var userDetails = User({ 
    username: req.body.username, 
    email: req.body.email, 
    password: bcrypt.hashSync(req.body.password1, bcrypt.genSaltSync(10)) 
}); 

User.findOne({ 
    $or: [{ 
     'username': req.body.username 
    }, { 
      'email': req.body.email 
     }] 
}, function (err, user) { 
    if (user) { 
     if (allClients.indexOf(req.body.socket)) { 
      if (user.username === req.body.username) { 
       io.to(req.body.socket).emit('userInfo', 'That username is already in use.'); 
      } else { 
      } 
      if (user.email === req.body.email) { 
       io.to(req.body.socket).emit('userInfo', 'That email is already in use.'); 
      } else { 
      } 
     } else { 
      console.log('timeout error 822') 
     } 
    } else { 
     req.login(userDetails, function (err) { 
      if (!err) { 
       userDetails.save(function (err) { 
        if (err) throw err; 
        res.redirect('/'); 
       }); 
      } else { 
       console.log(err) 
      } 
     }) 
    } 
    if (err) { 
     return done(err); 
    } 
}); 
}); 

這裏是我做ajax發佈請求的地方。正如你所看到的,我正在阻止表單提交來刷新頁面,但如果表單成功,它將提交。

$("#form1").submit(function(e) { 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: '/signup', 
      data: $(this).serialize(), 
      success: function(data) 
      { 
       window.location.reload(true); 
      } 
     }); 
}); 

回答

0

我相信你的'已經被採納'的消息被你的API認爲是成功的。 您可以在這些案例中輸入錯誤,使用$.ajax輸入catch或設置不同的回覆並在success上讀取data

+0

當我從ajax調用中刪除e.preventDefault時,一切似乎都正常。有沒有一種方法可以告訴服務器停止e.preventDefault函數的ajax請求,並在數據保存到mongo存儲後繼續重定向('/')? –

+0

我認爲這不是最好的方法。根據你正在使用的jQ版本添加一個'.error()'(或'.fail()')來檢查你回來的是什麼。或控制檯日誌'成功'上的數據... – AlvMF1

+0

當我發射到客戶端時,如何在這種情況下向ajax請求拋出錯誤? –