簡體   English   中英

在node.js中,我無法將表單數據輸入到mongodb中並使用mongoose退回以顯示在網頁上

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM