J'essaie d'ajouter une nouvelle route dans mon application express, mais je continue à avoir des erreurs en essayant de démarrer le serveur. L'erreur est
C:\development\node\express_app\node_modules\express\lib\router\index.js:252
throw new Error(msg);
^
Error: .get() requires callback functions but got a [object Undefined]
voici mes fichiers, je suis nouveau sur le noeud alors laissez-moi savoir si je laisse de côté un fichier important
routes/furniture.js
exports.furniture = function(req, res){
res.render('furniture', { title: '4\267pli' });
};
routes/index.js
/*
* GET home page.
*/
exports.index = function(req, res){
res.render('index', { title: '4\267pli' });
};
views/furniture.ejs
<!DOCTYPE html>
<html>
<head>
<title>4·pli -- architecture</title>
<link rel='stylesheet' href='/stylesheets/style.css'/>
<link href='http://fonts.googleapis.com/css?family=Didact+Gothic' rel='stylesheet' type='text/css'>
</head>
<body>
<div class="wrapper">
<h1 class="logo"><%= title %></h1>
</div>
</body>
</html>
app.js
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, furniture = require('./routes/furniture')
, http = require('http')
, path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/users', user.list);
app.get('/furniture', routes.furniture);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
Le problème est:
routes = require('./routes'),
user = require('./routes/user'),
furniture = require('./routes/furniture'),
Ces 3 définissent vos dossiers de routes, pas un fichier spécifique, express cherchera un index.js (introuvable, alors -> erreur)
Dans ces dossiers, vous devriez mettre un index.js avec votre:
exports.xxxx = function(req, res){
res.render('xx', { foo: foo});
};
Ensuite, la structure de votre dossier de projet devrait ressembler à ceci:
routes/
├── index.js
│
├── user/
│ └── index.js (with a exports.user inside)
│
└── fourniture/
└── index.js (with a exports.furniture inside)
Vous pouvez ajouter plusieurs fonctions d'exportation à un itinéraire comme celui-ci:
app.js
// a folder called routes with the index.js file inside
routes = require('./routes')
.
.
.
app.get('/', routes.main_function);
app.get('/sec_route', routes.sec_function);
app.post('/other_route', routes.other_function);
/routes/index.js
exports.main_function = function(req, res){
res.render('template1', { foo: foo });
};
exports.sec_function = function(req, res){
res.render('template2', { bar: bar });
};
exports.other_function = function(req, res){
res.render('template1', { baz: baz });
};
Si votre site Web est si gros parfois, je préfère faire quelque chose comme:
routes/furniture.js
:
module.exports = function(app)
{
app.get("/furniture/", function(req, res) {
res.render('furniture', { title: '4\267plieee' });
});
}
Et puis dans app.js
:
require("./routes/furniture")(app);
C'est principalement la même chose mais app.js sera plus propre.
Bien que ce soit un peu vieux, bien que de partager la façon dont je le fais. Voici une autre approche qui rend le code plus propre et facile à ajouter des itinéraires.
app.js
const app = express();
const routes = require('./routes');
app.use('/api', routes); //Main entry point
/routes/index.js
const router = require('express').Router();
const user = require('./user');
const admin = require('./admin');
//This is a simple route
router.get('/health-check', (req, res) =>
res.send('OK')
);
router.route('/users')
.post(validate, user.createUser);
router.route('/users/:userId')
.get(validateUser, user.getUser)
.patch(validateUser, user.updateUser)
.delete(validateUser, user.deleteUser);
router.route('/admins/:adminId/dashboard')
.get(validateAdmin,admin.getDashboard);
module.exports = router;
'validateUser' et 'validateAdmin' sont des marchandises intermédiaires personnalisées, qui seront utilisées pour valider les paramètres de requête ou pour effectuer un pré-traitement avant que la requête n'atteigne le véritable gestionnaire de requêtes. Ceci est facultatif et vous pouvez également avoir plusieurs middleware (séparés par des virgules).
/routes/user.js
module.exports = {
createUser:function(req,res,next){
},
updateUser:function(req,res,next){
},
deleteUser:function(req,res,next){
}
}
/routes/admin.js
module.exports = {
getDashboard:function(req,res,next){
}
}