问题
So I've been trying to work this out for some time now and I'm missing something here. I'm trying to determine the best practice for setting up routes in Express. I'd like to separate the different routes I have setup by file. I'm trying to use the Express Router module, but I can't get it to work. Here is my main server file:
var express = require('express');
var handlebars = require( 'express-handlebars' );
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
// Models
var db = require( './models/db.js' );
var user = require( './models/user.js' );
// Routes/Controllers
var routes = require( './routes/index.js' );
var userRouter = require( './routes/users.js' );
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine( 'handlebars', handlebars( { defaultLayout: 'main' } ) );
app.set('view engine', 'handlebars');
// 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: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// Routing Table
app.use('/', routes);
// User
app.use( '/users', require( './routes/users' ));
Here is are the routes for users:
var express = require('express');
var userRouter = express.Router();
var mongoose = require( 'mongoose' );
var bodyParser = require( 'body-parser' );
var methodOverride = require( 'method-override' );
userRouter.use( bodyParser.urlencoded({ extended: true }));
userRouter.use( methodOverride( function( req, res ) {
if ( req.body && typeof req.body === 'object' && '_method' in req.body ) {
var method = req.body._method;
delete req.body._method;
return method;
}}));
/* GET users listing. */
userRouter.get( '/users', function( req, res, next ) {
console.log( 'users GET' );
mongoose.model( 'User' ).find( {}, function( err, users ) {
if( err ) {
console.error( err );
} else {
console.log( users );
res.render( 'users/index', { users: users } );
}
});
})
.post( function( req, res, next ) {
console.log( req );
});
module.exports = userRouter;
And here is the form I'm trying to post with:
<form name='create-users' action='/users' method='post' >
<h6>Create Account</h6>
<fieldset>
<label for='username'>User Name</label>
<input name='username' id='newname' type='text' placeholder='User Name'>
<label for='email'>Email</label>
<input name='email' id='email' type='text' placeholder='Email'>
<label for='newpassword'>Password</label>
<input name='password' id='newpassword' type='text' placeholder='Password'>
<button type='submit'>Create</button>
</fieldset>
</form>
I'm know I'm not required the files properly, but this is simply giving me a 404 error.
回答1:
In your second file just listen for / route:
/* GET users listing. */
userRouter.get( '/', function( req, res, next ) {
console.log( 'users GET' );
mongoose.model( 'User' ).find( {}, function( err, users ) {
if( err ) {
console.error( err );
} else {
console.log( users );
res.render( 'users/index', { users: users } );
}
});
})
.post('/', function( req, res, next ) {
console.log( req );
});
Since you are listening in your first file app.use("/users"..)
来源:https://stackoverflow.com/questions/38508238/cannot-get-post-with-express-router