2016-03-23 17 views
0

Egal welchen Link ich in der Aktion meines Formulars deklariere, es gibt immer einen 404 Fehler zurück. Wenn ich die Methode ändern möchte, geht das nicht. Ich will Post benutzen, weil ich versuche, die Daten aus meinen Eingabefeldern zu bekommen und es in meiner mongedb Datenbank schreiben:NodeJS Express Post Formular - Aktion immer 404

HTML:

<form class="container-fluid searchContainer" action="/active" method="post"> 
    <div class="col-xs-6"> 
     <div class="form-group"> 
      <label for="businessUnit">Business unit</label> 
      <input type="text" ng-model="businessUnit" id="businessUnit" name="businessUnit" class="form-control"/> 
     </div> 
     <div class="form-group"> 
      <label for="tenderId">Tender ID</label> 
      <input type="text" name="tenderID" ng-model="tenderId" id="tenderId" class="form-control"/> 
     </div> 
    </div> 
    <div class="col-xs-6"> 
     <div class="form-group"> 
      <label for="tenderDate">Tender Bidding Date</label> 
      <input type="date" ng-model="tenderDate" name="tenderDate" id="tenderDate" class="form-control"/> 
     </div> 
     <div class="form-group"> 
      <label for="therapyArea">Therapy area</label> 
      <input type="text" ng-model="therapyArea" name="therapyArea" id="therapyArea" class="form-control"/> 
     </div> 

    </div> 
    <div class="col-md-12 text-right"> 
     <input type="submit" id="btnCreate" value="Create" class="btn btn-primary" > 
    </div> 
</form> 

javascript:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var routes = require('./routes/index'); 
var users = require('./routes/users'); 
var active = require('./routes/active'); 



var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 
app.use('/users', users); 
app.use('/active', active); 


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

// error handlers 



// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 


module.exports = app; 


var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/tenders'); 

var db = mongoose.connection; 

db.on('error', function(err) { 
    console.log('connection error', err); 
}); 
db.once('open', function() { 
    console.log('connected.'); 
}); 


var Schema = new mongoose.Schema({ 
    TenderID: String, 
    TenderDate: String, 
    BusinessUnit: String, 
    TherapyUnit: String 
}); 



var Tender = mongoose.model('Tender', Schema); 


app.post('/active', function(req, res) { 

    new Tender({ 
     TenderID: req.body.tenderID, 
     TenderDate: req.body.tenderDate, 
     BusinessUnit: req.body.businessunit, 
     TherapyUnit: req.body.therapyUnit 
    }).save(function(err, doc) { 
     if (err) res.json(err); 
     else res.send('Succesfully insterted') 

    }) 

}); 
+0

an sie übergeben werden, können Sie den Inhalt ./routes/active posten? –

Antwort

3

Da Sie Ihren 404-Routenhandler definieren, bevor Sie app.post('/active') definieren, wertet express die 404-Regel zuerst aus und gibt sie zurück. Ihre POST/aktive Route wird nie ausgewertet. Um dies zu beheben, müssen Sie Express vor der 404-Route (die immer Ihre letzte Route sein sollte) Ihre POST/aktive Route geben.

Es sei denn, Sie haben eine äquivalente POST/aktive Route in der Datei definiert ./routes/active, die Linie

app.use('/active', active); 

nicht dieses Problem beheben, obwohl es vor Ihrer 404 Route ausgewertet wird. Sie können mehr über app.use() vs app.get|post|etc()in the express docs lesen.

Express wertet Regeln in der Reihenfolge, wie sie über use() oder get|post|delete|etc()

+0

Das hat gut funktioniert! Aber wie kann ich eine Ansicht nach dem Posten sehen? Im Moment sehe ich "Succesfully instered" vom Res.Send, wie kann ich die aktive Ansicht sehen? –

+0

@SanderVanKeer Das einzige, was Sie gerade zurück zum Browser senden, ist "Erfolgreich eingefügt". Sie müssten also eine vollständige HTML-Seite zurücksenden (res.sendFile) oder eine Vorlage rendern (etwas wie [jade] (http://jade-lang.com) würde funktionieren). Wenn Sie nicht möchten, dass Ihre Formularübergabe Sie auf eine neue Seite bringt, müssen Sie einige JavaScript auf der Clientseite mit [AJAX techniques] (https://developer.mozilla.org/en-US/docs/AJAX) schreiben /Anfangen). –

+0

Ich habe gerade eine res.redirect() verwendet, aber danke für deine Hilfe, du hast mir wirklich geholfen! –

0

Ihnen habe in deinem Server die Route get definiert. Versuchen Sie, die Änderung

app.get('/active',function(req,res){ 

in

app.post('/active',function(req,res){ 

Auf diese Weise werden Sie auf eine Post-Anforderung vom Browser antworten.

+0

Ich habe es in der Frage bearbeitet, es gibt immer noch das gleiche Problem –

+0

Ich sehe, dass Sie auch eine Route 'app.use ('/ active', aktiv);' Könnten Sie versuchen, eine der ihnen umzubenennen? –