如何在多个文件中包括路由处理程序?

在我的NodeJS express应用程序中,我有app.js,它有一些公共路由。然后在wf.js文件中,我想定义更多的路由。

如何让app.js识别在wf.js文件中定义的其他路由处理程序?

简单的需要似乎不能工作。

299085 次浏览

如果你想把路由放在一个单独的文件中,例如routes.js,你可以这样创建routes.js文件:

module.exports = function(app){


app.get('/login', function(req, res){
res.render('login', {
title: 'Express Login'
});
});


//other routes..
}

然后你可以这样从app.js传递app对象来要求它:

require('./routes')(app);

看看这些例子:https://github.com/visionmedia/express/tree/master/examples/route-separation

基于@ShadowCloud的例子,我能够在子目录中动态地包含所有路由。

路线/ 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);
});
}

然后将路由文件放在routes目录中,如下所示:

路线/ test1.js

module.exports = function(app){


app.get('/test1/', function(req, res){
//...
});


//other routes..
}

根据需要重复多次,然后最后在app.js放置

require('./routes')(app);

在前面答案的基础上,这个版本的routes/index.js将忽略任何以.js(和它本身)结尾的文件。

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

所有这些答案的一个调整:

var routes = fs.readdirSync('routes')
.filter(function(v){
return (/.js$/).test(v);
});

只需使用正则表达式通过测试数组中的每个文件进行筛选。它不是递归的,但它会过滤掉不以.js结尾的文件夹

/routes文件夹中所有.js文件的完全递归路由,将其放在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

/routes中放入whatevername.js并像这样初始化你的路由:

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

如果你想要一个单独的.js文件来更好地组织你的路由,只需在app.js文件中创建一个变量,指向它在文件系统中的位置:

var wf = require(./routes/wf);

然后,

app.get('/wf', wf.foo );

其中.foo是在你的wf.js文件中声明的某个函数。如

// wf.js file
exports.foo = function(req,res){


console.log(` request object is ${req}, response object is ${res} `);


}

我知道这是一个老问题,但我一直在为自己寻找答案,而这就是我最后的归宿,所以我想把我的解决方案用在类似的问题上,以防别人有和我一样的问题。有一个很好的节点模块叫做交付,它为你做了很多在这里看到的文件系统的东西(即-没有readdirSync的东西)。例如:

我有一个restful API应用程序,我试图构建,我想把所有的请求,去'/ API /*'进行身份验证,我想存储所有的路由,在API到他们自己的目录(让我们只是叫它' API ')。在应用程序的主要部分:

app.use('/api', [authenticationMiddlewareFunction], require('./routes/api'));

在routes目录中,我有一个名为“api”的目录和一个名为api.js的文件。在api.js中,我简单地有:

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;

一切都按照预期进行。希望这能帮助到一些人。

在快车4号。X,你可以得到一个路由器对象的实例,并导入另一个包含更多路由的文件。您甚至可以递归地执行此操作,以便您的路由导入其他路由,从而允许您创建易于维护的URL路径。

例如,如果我的/tests端点已经有一个单独的路由文件,并且想为/tests/automated添加一组新的路由,我可能想把这些/automated路由分解到另一个文件中,以保持我的/test文件小而易于管理。它还可以让你在逻辑上把路由按URL路径组合在一起,这非常方便。

./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);

./routes/tests.js的内容:

var express = require('express'),
router = express.Router();


var automatedRoutes = require('./testRoutes/automated');


router
// Add a binding to handle '/tests'
.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;

./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;

我写了一个小插件来做这件事!我厌倦了一遍又一遍地写同样的代码。

https://www.npmjs.com/package/js-file-req

希望能有所帮助。

我正在尝试用"express": "^4.16.3"更新这个答案。这个答案与ShortRound1911的答案相似。

server.js:

const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const db = require('./src/config/db');
const routes = require('./src/routes');
const port = 3001;


const app = new express();


//...use body-parser
app.use(bodyParser.urlencoded({ extended: true }));


//...fire connection
mongoose.connect(db.url, (err, database) => {
if (err) return console.log(err);


//...fire the routes
app.use('/', routes);


app.listen(port, () => {
console.log('we are live on ' + port);
});
});

/ src /线路/ index.js:

const express = require('express');
const app = express();


const siswaRoute = require('./siswa_route');


app.get('/', (req, res) => {
res.json({item: 'Welcome ini separated page...'});
})
.use('/siswa', siswaRoute);


module.exports = app;

/ src /线路/ siswa_route.js:

const express = require('express');
const app = express();


app.get('/', (req, res) => {
res.json({item: 'Siswa page...'});
});


module.exports = app;

如果你在打印稿和ES6中使用表达- 4. x,这将是最好的模板:

src/api/login.ts

import express, { Router, Request, Response } from "express";


const router: Router = express.Router();
// POST /user/signin
router.post('/signin', async (req: Request, res: Response) => {
try {
res.send('OK');
} catch (e) {
res.status(500).send(e.toString());
}
});


export default router;

src/app.ts

import express, { Request, Response } from "express";
import compression from "compression";  // compresses requests
import expressValidator from "express-validator";
import bodyParser from "body-parser";
import login from './api/login';


const app = express();


app.use(compression());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(expressValidator());


app.get('/public/hc', (req: Request, res: Response) => {
res.send('OK');
});


app.use('/user', login);


app.listen(8080, () => {
console.log("Press CTRL-C to stop\n");
});

比使用varmodule.exports干净得多。

你可以把所有的路由函数放在其他文件(模块),并将其链接到主服务器文件。 在主express文件中,添加将模块链接到服务器的函数:

   function link_routes(app, route_collection){
route_collection['get'].forEach(route => app.get(route.path, route.func));
route_collection['post'].forEach(route => app.post(route.path, route.func));
route_collection['delete'].forEach(route => app.delete(route.path, route.func));
route_collection['put'].forEach(route => app.put(route.path, route.func));
}

并为每个路由模型调用该函数:

link_routes(app, require('./login.js'))

在模块文件(例如- login.js文件)中,像往常一样定义函数:

const login_screen = (req, res) => {
res.sendFile(`${__dirname}/pages/login.html`);
};


const forgot_password = (req, res) => {
console.log('we will reset the password here')
}

然后用request方法导出它作为键,值是一个对象数组,每个对象都有路径和功能键。

module.exports = {
get: [{path:'/',func:login_screen}, {...} ],
post: [{path:'/login:forgotPassword', func:forgot_password}]
};

index.js

const express = require("express");
const app = express();
const http = require('http');
const server = http.createServer(app).listen(3000);
const router = (global.router = (express.Router()));
app.use('/books', require('./routes/books'))
app.use('/users', require('./routes/users'))
app.use(router);

路线/ users.js

const router = global.router
router.get('/', (req, res) => {
res.jsonp({name: 'John Smith'})
}


module.exports = router

路线/ books.js

const router = global.router
router.get('/', (req, res) => {
res.jsonp({name: 'Dreams from My Father by Barack Obama'})
}


module.exports = router

如果您的服务器在本地运行(http://localhost:3000),那么

// Users
curl --request GET 'localhost:3000/users' => {name: 'John Smith'}


// Books
curl --request GET 'localhost:3000/books' => {name: 'Dreams from My Father by Barack Obama'}