2016-09-09 51 views
1

我嘗試通過表單輸入在mongoDB中插入數據。問題是,我重定向到「/新」,並收到「文件未找到」錯誤,而不是「成功插入」這個說法。我嘗試將用戶信息存儲在現有集合'user'中 - 之後,我想要在路徑'/retrieve.pug'中輸入表單中的數據並將其顯示在客戶端。我深深體會到,如果有人可以幫助我這個,這是我的代碼:通過表單輸入在mongodb中插入數據+ Express.js

app.js

var express = require('express'); 
var bodyParser = require('body-parser'); 
var methodOverride = require('method-override'); 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var session = require('express-session'); 
var MongoStore = require('connect-mongo')(session); 
var User = require('./models/user'); 
var app = express(); 

// mongodb connection 
mongoose.connect("mongodb://localhost:27017/socialempireclub"); 
var db = mongoose.connection; 

// mongo error 
db.on('error', console.error.bind(console, 'connection error:')); 

// use sessions for tracking logins 
app.use(session({ 
    secret: 'treehouse loves you', 
    resave: true, 
    saveUninitialized: false, 
    store: new MongoStore({ 
    mongooseConnection: db 
    }) 
})); 

// make user ID available in templates 
app.use(function (req, res, next){ 
    res.locals.currentUser = req.session.userId; 
    next(); 
}); 

// parse incoming requests 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(require('express-method-override')('method_override_param_name')); 
// serve static files from /public 
app.use(express.static(__dirname + '/public')); 

// view engine setup 
app.set('view engine', 'pug'); 
app.set('views', __dirname + '/views'); 

// include routes 
var routes = require('./routes/index'); 
app.use('/', routes); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('File Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
// define as the last app.use callback 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 

app.post('/new', function(req, res){ 
    new user({ 
    country: req.body.country 
    }).save(function(err, user){ 
     if(err) res.json(err); 
     else res.send('Sucessfully inserted'); 
    }); 
}); 

app.get('/retrieve', function(req, res){ 
    user.find({}, function(err, user){ 
     if(err) res.json(err); 
     else res.render('retrieve', {users: docs}); 
    }); 
}); 

// listen on port 3000 
app.listen(3000, function() { 
    console.log('Express app listening on port 3000'); 
}); 

user.js的模型

var mongoose = require('mongoose'); 
var bcrypt = require('bcrypt'); 
var UserSchema = new mongoose.Schema({ 
    username: { 
    type: String, 
    unique: true, 
    required: true, 
    trim: true 
    }, 
    email: { 
    type: String, 
    unique: true, 
    required: true, 
    trim: true 
    }, 
    password: { 
    type: String, 
    required: true 
    }, 
    country: String 
}); 
// authenticate input against database documents 
UserSchema.statics.authenticate = function(email, password, callback) { 
    User.findOne({ email: email }) 
    .exec(function (error, user){ 
     if (error) { 
     return callback(error); 
     } else if (!user) { 
     var err = new Error('User not found.'); 
     err.status = 401; 
     return callback(err); 
     } 
     bcrypt.compare(password, user.password, function(error, result){ 
     if (result === true) { 
      return callback(null, user); 
     } else { 
      return callback(); 
     } 
     }) 
    }); 
} 
// hash password before saving to database 
UserSchema.pre('save', function(next){ 
    var user = this; 
    bcrypt.hash(user.password, 10, function(err, hash){ 
    if (err) { 
     return next(err); 
    } 
    user.password = hash; 
    next(); 
    }) 
}); 
var user = mongoose.model('user', UserSchema); 
module.exports = user; 

profile.pug //帕格模板引擎//用戶信息+形式輸入

p.heading-profile Contact details 
       form(action='/new', method='POST') 
        p 
        | First name 
        input.form-control.input-first-name(type='text', placeholder='First name', aria-describedby='sizing-addon3') 
        p 
        | Last name 
        input.form-control.input-last-name(type='text', placeholder='Last name', aria-describedby='sizing-addon3') 
        p 
        | Street address 
        input.form-control.input-street-address(type='text', placeholder='Street address', aria-describedby='sizing-addon3') 
        p 
        | City 
        input.form-control.input-city(type='text', placeholder='City', aria-describedby='sizing-addon3') 
        p 
        | State/Province 
        input.form-control.input-state(type='text', placeholder='State/Province', aria-describedby='sizing-addon3') 
        p 
        | Zip/Post Code 
        input.form-control.input-zip(type='text', placeholder='Zip/Post code', aria-describedby='sizing-addon3') 
        label(for='country') Country 
        input.form-control.input-country(type='text', name='country', aria-describedby='sizing-addon3') 
        input.button(type='submit', value='Edit') 

最後,retrieve.pug

html 
    head 
    title Registration Form 
    body 
ul 
each user in users 
    form(action='', method='POST') 
     label(for='user[email]') Email: 
     input(type='text', name="user[_id]", value=user._id) 
     br 
     label(for='user[country]') Country: 
     input(type='text', name="user[country]", value=user.country) 
     br 
     input(type='submit') 
+0

你可以在這裏發佈錯誤? – abdulbarik

+0

感謝您的評論,錯誤是'文件未找到'。在表單輸入中點擊「提交」按鈕後顯示,路由爲「/新」。這是我得到的唯一的錯誤,我有點無知,這是怎麼回事。 – Thimxo

+0

關於'/ new'哪個帕格是你渲染和它在哪裏? – abdulbarik

回答

0

如果要重定向路徑/new,那麼你必須給一個頁面,以便POST呼叫渲染數據Browser預期,但沒有得到,這就是爲什麼你得到這個error任何頁面。

嘗試創建一個new.pug,所有的pug files存在該文件,併爲此

app.post('/new', function(req, res) { 
    new user({ 
     country: req.body.country 
    }).save(function(err, user) { 
     if (err) res.json(err); 
     else { 
      res.render('new', { 
       mesage: 'Sucessfully inserted' 
      }); 
     } 
    }); 
}); 

例如用於顯示簡單的消息

block content 
    p Welcome to #{message} 
+0

好的,非常感謝,abdulbarik,這很有道理。我創建了一個新文件'new.pug'。我應該寫什麼內容或顯示? – Thimxo

+0

我剛剛用new.pug文件更新了答案,您可以使用這個 – abdulbarik

+0

我試圖在昨天將數據插入到mongoDB中,與上面類似,但我僅使用了表單輸入並在'/ new'路由上發送了響應,併成功顯示'成功插入'。畢竟,數據實際上在mongoDB內部。所以現在我試圖在我的網絡應用程序中實現它 - 以同樣的方式 - 但它停在'未找到文件'。因此,我不知道爲什麼它沒有創建一個'new.pug' - 文件昨天。 – Thimxo

0

這裏創建new.pug是解決方案:

  • 我在mongoDB中創建了兩種不同的模式:1)user 2)user_i NFO
  • 然後我有線它在我的app.js,並顯示在USER_INFO形式輸入到客戶端