2016-09-09 33 views
1

フォーム入力でmongoDBにデータを挿入しようとしています。問題は、「/ new」にリダイレクトされ、「Successfully inserted」という言葉の代わりに「File not found」エラーが表示されることです。私は、既存のコレクション 'user'にユーザー情報を保存しようとします。その後、 '/retrieve.pug'というパスの入力フォームにデータを表示し、それをクライアント側に表示したいと思います。誰かがこれで私を助けることができれば、私は深く、感謝、ここに私のコードは次のとおりです。フォーム入力+ Express.js経由でmongodbにデータを挿入

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'ボタンを押すと表示され、ルートは '/ new'です。それは私が得ている唯一のエラーです、私はちょっと無知です、どうしてそれが起こりますか? – Thimxo

+0

'/ new'ではpugをレンダリングしていますか? – abdulbarik

答えて

0

あなたがルート/newをリダイレクトしているなら、あなたはBrowserがそれを期待するようPOSTコールでデータをレンダリングするためのページを与える必要があり、それはあなたがこのerrorを得ている理由ですどのページを取得できません。単純なメッセージ

block content 
    p Welcome to #{message} 
+0

ありがとう、abdulbarik、それは理にかなっています。私は新しいファイル 'new.pug'を作成しました。私は何の中に書いたり、表示したりするべきですか? – Thimxo

+0

私はちょうどこれを使用することができますnew.pugファイルで回答を更新 – abdulbarik

+0

昨日、mongoDBにデータを挿入しようとしましたが、私はフォーム入力を使用し、 '/ new'ルート上で応答を送信し、正常に挿入されました。結局のところ、データは実際にはmongoDB内にあります。だから私は私のWebアプリケーションでそれを実装しようとしました - 同じ方法 - しかし、それは 'ファイルが見つかりません'で停止します。したがって、私は昨日 'new.pug'ファイルを作成せずになぜそれが機能するのか分かりません。 – Thimxo

0

を示すためnew.pugを作成し、すべてのpug filesが存在new.pugファイルを作成し、例えば、この

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' 
      }); 
     } 
    }); 
}); 

を行うには

てみここソリューションです:

  • 私はmongoDBで2つの異なるスキーマを作成しました:1)user 2)user_i
  • NFOそれから私は私のapp.jsでそれを有線、およびクライアントにUSER_INFOのフォーム入力を表示
関連する問題