[英]in node.js I can't get form data into mongodb and back out to display on webpage using mongoose
我試圖建立一個應用程序,使用戶可以簡單地輸入有關自己的數據,然后在以后將其顯示在網頁上。 我使用護照進行本地身份驗證,然后Web應用程序顯示html表單,用戶可以在其中輸入數據,然后將數據顯示在下一頁上,但是每次測試時都會出錯。 我打算將身份驗證中的用戶名用作數據庫“標識符”,但是如果還有另一種查找數據的方法,請告訴我。
這是用於數據的html表單,由於下拉菜單很長
<div id="userinfo">
<form id="infoform" action="/profile" method="POST">
<center><h1><i>User Information</i></h1></center>
<center><h3>Enter Firstname: <input type="text" name="firstname" id="fname"></input></h3></center>
<center><h3>Enter Lastname: <input type="text" name="lastname" id="lname"></input></h3></center>
<center><h3>Birthday:
<select name="birthmonth" id="bmonth">
<option value="January">January</option>
<option value="Febuary">Febuary</option>
<option value="March">March</option>
<option value="April">April</option>
<option value="May">May</option>
<option value="June">June</option>
<option value="July">July</option>
<option value="August">August</option>
<option value="September">September</option>
<option value="Octopber">October</option>
<option value="November">November</option>
<option value="December">December</option>
</select>
<select name="birthday" id="bday">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
<select name="birthyear" id="byear">
<option value="2015">2015</option>
<option value="2014">2014</option>
<option value="2013">2013</option>
<option value="2012">2012</option>
<option value="2011">2011</option>
<option value="2010">2010</option>
<option value="2009">2009</option>
<option value="2008">2008</option>
<option value="2007">2007</option>
<option value="2006">2006</option>
<option value="2005">2005</option>
<option value="2004">2004</option>
<option value="2003">2003</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>
<option value="1999">1999</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1996">1996</option>
<option value="1995">1995</option>
<option value="1994">1994</option>
<option value="1993">1993</option>
<option value="1992">1992</option>
<option value="1991">1991</option>
<option value="1990">1990</option>
<option value="1989">1989</option>
<option value="1988">1988</option>
<option value="1987">1987</option>
<option value="1986">1986</option>
</select>
</h3></center>
<center><h3>Sex: <input type="radio" name="sex" value="male">Male <input type="radio" name="sex" value="female">Female
<center><h3>Enter Email: <input type="email" name="useremail" id="email" cols="15" rows="1"></input></h3></center>
<center><h3>High School Education: <input type="text" name="hsedu" id="hs"></input></h3></center>
<center><h3>Graduation Year:
<select name="hsgradyear" id="hsgrad">
<option value="2015">2015</option>
<option value="2014">2014</option>
<option value="2013">2013</option>
<option value="2012">2012</option>
<option value="2011">2011</option>
<option value="2010">2010</option>
<option value="2009">2009</option>
<option value="2008">2008</option>
<option value="2007">2007</option>
<option value="2006">2006</option>
<option value="2005">2005</option>
<option value="2004">2004</option>
<option value="2003">2003</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>
<option value="1999">1999</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1996">1996</option>
<option value="1995">1995</option>
<option value="1994">1994</option>
<option value="1993">1993</option>
<option value="1992">1992</option>
<option value="1991">1991</option>
<option value="1990">1990</option>
<option value="1989">1989</option>
<option value="1988">1988</option>
<option value="1987">1987</option>
<option value="1986">1986</option>
</select>
</h3></center>
<center><h3>College Education: <input type="text" name="colledu" id="coll"></input></h3></center>
<center><h3>Graduation Year:
<select name="collgradyear" id="collgrad">
<option value="2015">2015</option>
<option value="2014">2014</option>
<option value="2013">2013</option>
<option value="2012">2012</option>
<option value="2011">2011</option>
<option value="2010">2010</option>
<option value="2009">2009</option>
<option value="2008">2008</option>
<option value="2007">2007</option>
<option value="2006">2006</option>
<option value="2005">2005</option>
<option value="2004">2004</option>
<option value="2003">2003</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>
<option value="1999">1999</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1996">1996</option>
<option value="1995">1995</option>
<option value="1994">1994</option>
<option value="1993">1993</option>
<option value="1992">1992</option>
<option value="1991">1991</option>
<option value="1990">1990</option>
<option value="1989">1989</option>
<option value="1988">1988</option>
<option value="1987">1987</option>
<option value="1986">1986</option>
</select><br><br>
<center><input type="submit" value="Enter Info"></input></center>
</form>
</div>
這是服務器代碼的一部分
app.get('/profile', isLoggedIn, function(req, res){
res.render('profile', {
user : req.user,
});
});
app.post('/profile', function(req, res, userinfo) {
console.log(req.body);
var userinfo = new userinfo();
userinfo.info.username = req.user.local.username
userinfo.info.firstname = req.body.firstname
userinfo.info.lastname = req.body.lastname
userinfo.info.birthmonth = req.body.birthmonth
userinfo.info.birthday = req.body.birthday
userinfo.info.birthyear = req.body.birthyear
userinfo.info.sex = req.body.sex
userinfo.info.email = req.body.email
userinfo.info.hsedu = req.body.hsedu
userinfo.info.hsgradyear = req.body.hsgradyear
userinfo.info.colledu = req.body.colledu
userinfo.info.collgradyear = req.body.collgradyear
userinfo.save(function(err, userinfo){
if(err)
throw err;
})
res.redirect('/userprofile');
})
app.get('/userprofile', function(req, res) {
userinfo.findOne({'info.username' : 'req.user.local.username'}, function(err, userinfo) {
if(err)
return handleError(err);
})
res.render('userprofile', {
userinfo : userinfo,
user : req.user
})
})
您在使用構造函數和變量使用相同的標識符的命名中存在沖突:
var userinfo = new userinfo();
該var
將被吊起 ,從而使其對構造函數產生陰影 ,因此該行實質上變為:
var userinfo;
userinfo = new undefined();
為此,可以遵循用大寫字母命名構造函數的約定,以區分它:
// you haven't shown how it's declared, but I'm assuming in another module for the example
var UserInfo = require('./models/userinfo');
var userinfo = new UserInfo();
這種命名沖突也會影響app.get('/userprofile', ...);
使用的render()
app.get('/userprofile', ...);
。 當前,提供給視圖的局部值是構造函數本身而不是單個文檔。
document變量僅存在於.findOne()
提供的回調function
。 因此,要將其作為本地傳遞,您需要在該function
內執行.render()
:
UserInfo.findOne(..., function (err, userinfo) {
res.render('userprofile', {
userinfo : userinfo,
user : req.user
});
});
您還需要刪除查詢對象中值周圍的引號:
UserInfo.findOne({'info.username' : req.user.local.username}, ...);
該鍵應代表一個屬性路徑,並且需要使用引號將其括起來.
被包括在內,所以引用就可以了。
但是,通過引用該值,查詢將查找包含"req.user.local.username"
的文檔作為精確的字符串值,而不是訪問req
對象的屬性。
在代碼中,應編寫res.render('userprofile'...)和res.redirect('/ userprofile'); 應該在相應的回調中
userinfo.findOne(...., callback);
userinfo.save(callback);
而且var userinfo = new userinfo(); 在另一個方法中定義,而不是在該方法中定義,最好編寫一個函數並在此處調用
因此下面的代碼應該是正確的方法
app.get('/userprofile', function(req, res) {
//code for var userinfo = new userinfo();
.....
.....
userinfo.findOne({'info.username' : 'req.user.local.username'}, function(err, userinfo) {
if(err)
return handleError(err);
res.render('userprofile', {
userinfo : userinfo,
user : req.user
});
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.