2016-09-09 2 views
1

Я пытаюсь вставить данные в mongoDB через ввод формы. Проблема в том, что я перенаправляюсь на «/ new» и получаю ошибку «Файл не найден», вместо сообщения «Успешно вставлено». Я пытаюсь хранить информацию о пользователе в существующем пользователе коллекции - после этого я хотел бы отобразить данные в форме ввода в пути /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

Спасибо за ваш комментарий, ошибка: «Файл не найден». Он отображается после нажатия кнопки «submit» на входе формы, а маршрут - «/ новый». Это единственная ошибка, которую я получаю, я не знаю, как это происходит. – 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' 
      }); 
     } 
    }); 
}); 

Например создать new.pug для показа простого сообщения

block content 
    p Welcome to #{message} 
+0

Хорошо, спасибо, абдулбарик, это имеет смысл. Я создал новый файл 'new.pug'. Что я должен писать внутри или отображать? – Thimxo

+0

Я только что обновил ответ с помощью файла new.pug, вы можете использовать это – abdulbarik

+0

Я попытался вставить данные в mongoDB вчера, как и ранее, но я использовал только ввод формы и отправил ответ на маршрут '/ new', и он успешно отобразился ' Успешно вставлено ". В конце концов, данные были фактически внутри mongoDB. Итак, теперь я попытался реализовать его в своем веб-приложении - так же, но он останавливается в «Файл не найден». Поэтому я не уверен, почему он работал без создания файла «new.pug» вчера. – Thimxo

0

Вот решение:

  • Я создал две разные схемы в mongoDB: 1) пользователь 2) user_i NFO
  • Тогда я проводное это в моем app.js и отображаюсь форма ввода user_info клиента
Смежные вопросы