node.js - tutorial - subir archivos node js
¿Cómo incluir manejadores de ruta en múltiples archivos en Express? (10)
¡Escribí un pequeño complemento para hacer esto! se cansó de escribir el mismo código una y otra vez.
https://www.npmjs.com/package/js-file-req
Espero eso ayude.
En mi aplicación express
NodeJS tengo app.js
que tiene algunas rutas comunes. Luego, en un archivo wf.js
, me gustaría definir algunas rutas más.
¿Cómo puedo hacer que app.js
reconozca otros manejadores de ruta definidos en el archivo wf.js
?
Un requisito simple no parece funcionar.
A pesar de que esta es una pregunta más antigua, me encontré aquí buscando una solución a un problema similar. Después de probar algunas de las soluciones aquí, terminé yendo en una dirección diferente y pensé que agregaría mi solución a cualquier persona que termine aquí.
En Express 4.x puede obtener una instancia del objeto enrutador e importar otro archivo que contenga más rutas. Incluso puede hacerlo de forma recursiva para que sus rutas importen otras rutas y le permita crear rutas de URL fáciles de mantener. Por ejemplo, si ya tengo un archivo de ruta separado para mi punto final ''/ tests'' y deseo agregar un nuevo conjunto de rutas para ''/ tests / automated'', es posible que desee romper estas rutas ''/ automatizadas'' en otro archivo para mantener mi archivo ''/ test'' pequeño y fácil de administrar. También le permite agrupar lógicamente rutas juntas por ruta de URL que puede ser realmente conveniente.
Contenido de ./app.js:
var express = require(''express''),
app = express();
var testRoutes = require(''./routes/tests'');
// Import my test routes into the path ''/test''
app.use(''/tests'', testRoutes);
Contenido de ./routes/tests.js
var express = require(''express''),
router = express.Router();
var automatedRoutes = require(''./testRoutes/automated'');
router
// Add a binding to handle ''/test''
.get(''/'', function(){
// render the /tests view
})
// Import my automated routes into the path ''/tests/automated''
// This works because we''re already within the ''/tests'' route so we''re simply appending more routes to the ''/tests'' endpoint
.use(''/automated'', automatedRoutes);
module.exports = router;
Contenido de ./routes/testRoutes/automated.js:
var express = require(''express''),
router = express.Router();
router
// Add a binding for ''/tests/automated/''
.get(''/'', function(){
// render the /tests/automated view
})
module.exports = router;
Enrutamiento recursivo completo de todos los archivos .js
en la carpeta /routes
, ponga esto en app.js
// Initialize ALL routes including subfolders
var fs = require(''fs'');
var path = require(''path'');
function recursiveRoutes(folderName) {
fs.readdirSync(folderName).forEach(function(file) {
var fullName = path.join(folderName, file);
var stat = fs.lstatSync(fullName);
if (stat.isDirectory()) {
recursiveRoutes(fullName);
} else if (file.toLowerCase().indexOf(''.js'')) {
require(''./'' + fullName)(app);
console.log("require(''" + fullName + "'')");
}
});
}
recursiveRoutes(''routes''); // Initialize it
en /routes
pones whatevername.js
e inicializas tus rutas de esta manera:
module.exports = function(app) {
app.get(''/'', function(req, res) {
res.render(''index'', { title: ''index'' });
});
app.get(''/contactus'', function(req, res) {
res.render(''contactus'', { title: ''contactus'' });
});
}
Esta es posiblemente la pregunta / respuesta de desbordamiento de pila más asombrosa jamás realizada. Me encantan las soluciones de Sam / Brad anteriores. Pensé que entraría en la versión asíncrona que implementé:
function loadRoutes(folder){
if (!folder){
folder = __dirname + ''/routes/'';
}
fs.readdir(folder, function(err, files){
var l = files.length;
for (var i = 0; i < l; i++){
var file = files[i];
fs.stat(file, function(err, stat){
if (stat && stat.isDirectory()){
loadRoutes(folder + ''/'' + file + ''/'');
} else {
var dot = file.lastIndexOf(''.'');
if (file.substr(dot + 1) === ''js''){
var name = file.substr(0, dot);
// I''m also passing argv here (from optimist)
// so that I can easily enable debugging for all
// routes.
require(folder + name)(app, argv);
}
}
});
}
});
}
Mi estructura de directorio es un poco diferente. Normalmente, defino rutas en app.js (en el directorio raíz del proyecto) require
''./routes''
. En consecuencia, me estoy saltando el cheque contra index.js
porque quiero incluir ese también.
EDITAR: También puede poner esto en una función y llamarlo recursivamente (he editado el ejemplo para mostrar esto) si desea anidar sus rutas en carpetas de profundidad arbitraria.
Sé que esta es una vieja pregunta, pero estaba tratando de encontrar algo así para mí y este es el lugar donde terminé, así que quería poner mi solución a un problema similar en caso de que alguien más tenga los mismos problemas que yo '' m teniendo Hay un buen módulo de nodos llamado consign que hace muchas cosas del sistema de archivos que se ven aquí para usted (es decir, sin elementos readdirSync). Por ejemplo:
Tengo una aplicación de API relajante que estoy tratando de compilar y quiero poner todas las solicitudes que van a ''/ api / *'' para ser autenticadas y quiero almacenar todas mis rutas que van en la API en su propio directorio (llamémoslo ''api''). En la parte principal de la aplicación:
app.use(''/api'', [authenticationMiddlewareFunction], require(''./routes/api''));
Dentro del directorio de rutas, tengo un directorio llamado "api" y un archivo llamado api.js. En api.js, simplemente tengo:
var express = require(''express'');
var router = express.Router();
var consign = require(''consign'');
// get all routes inside the api directory and attach them to the api router
// all of these routes should be behind authorization
consign({cwd: ''routes''})
.include(''api'')
.into(router);
module.exports = router;
Todo funcionó como se esperaba. Espero que esto ayude a alguien.
Si desea colocar las rutas en un archivo separado , por ejemplo routes.js
, puede crear el archivo routes.js
de esta manera:
module.exports = function(app){
app.get(''/login'', function(req, res){
res.render(''login'', {
title: ''Express Login''
});
});
//other routes..
}
Y luego puede app.js
desde app.js
pasando el objeto de la app
de esta manera:
require(''./routes'')(app);
También eche un vistazo a estos ejemplos
https://github.com/visionmedia/express/tree/master/examples/route-separation
Si desea un archivo .js separado para organizar mejor sus rutas, simplemente cree una variable en el archivo app.js
que apunta a su ubicación en el sistema de archivos:
var wf = require(./routes/wf);
entonces,
app.get(''/wf'', wf.foo );
donde .foo
es alguna función declarada en su archivo wf.js
p.ej
// wf.js file
exports.foo = function(req,res){
console.log(` request object is ${req}, response object is ${res} `);
}
Sobre la base del ejemplo de @ShadowCloud, pude incluir dinámicamente todas las rutas en un subdirectorio.
routes / index.js
var fs = require(''fs'');
module.exports = function(app){
fs.readdirSync(__dirname).forEach(function(file) {
if (file == "index.js") return;
var name = file.substr(0, file.indexOf(''.''));
require(''./'' + name)(app);
});
}
A continuación, coloca los archivos de ruta en el directorio de rutas de esta manera:
routes / test1.js
module.exports = function(app){
app.get(''/test1/'', function(req, res){
//...
});
//other routes..
}
Repitiendo eso tantas veces como necesité y finalmente en app.js colocando
require(''./routes'')(app);
Un ajuste a todas estas respuestas:
var routes = fs.readdirSync(''routes'')
.filter(function(v){
return (/.js$/).test(v);
});
Simplemente use una expresión regular para filtrar mediante la prueba de cada archivo en la matriz. No es recursivo, pero filtrará las carpetas que no terminan en .js
Y compila aún más en la respuesta anterior, esta versión de routes / index.js ignorará cualquier archivo que no termine en .js (y sí mismo)
var fs = require(''fs'');
module.exports = function(app) {
fs.readdirSync(__dirname).forEach(function(file) {
if (file === "index.js" || file.substr(file.lastIndexOf(''.'') + 1) !== ''js'')
return;
var name = file.substr(0, file.indexOf(''.''));
require(''./'' + name)(app);
});
}