2016-09-09 52 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形式输入到客户端