답변:
당신이하려는 경우 별도의 파일에 경로를 넣어 , 예를 들어 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
이것은 오래된 질문이지만 비슷한 문제에 대한 해결책을 찾기 위해 여기에서 우연히 발견되었습니다. 여기에 몇 가지 솔루션을 시도한 후에 다른 방향으로 가고 결국 여기에있는 다른 사람을 위해 솔루션을 추가 할 것이라고 생각했습니다.
express 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 '/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;
./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;
@ShadowCloud의 예를 바탕으로 하위 디렉토리에 모든 경로를 동적으로 포함시킬 수있었습니다.
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);
});
}
그런 다음 다음과 같이 경로 파일을 경로 디렉토리에 배치하십시오.
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);
});
}
.DS_Store
파일을 추가하는 Mac의 누군가가 있었고 모든 것을 망쳐 놓았습니다.
폴더 .js
안에 있는 모든 파일 의 전체 재귀 라우팅 ./routes
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' });
});
}
이 답변을 "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/routes/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/routes/siswa_route.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.json({item: 'Siswa page...'});
});
module.exports = app;
이것이 누군가를 도울 수 있기를 바랍니다. 행복한 코딩!
TypeScript 및 ES6 과 함께 express-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");
});
사용하는 것보다 훨씬 깨끗 var
하고 module.exports
.
나는 이것이 오래된 질문이라는 것을 알고 있지만, 나는 나 자신과 같은 것을 알아 내려고 노력하고 있었고 이것이 내가 끝낸 곳이므로 다른 누군가가 같은 문제가있는 경우 비슷한 문제에 대한 해결책을 제시하고 싶었다. 나는 가지고있다. consign 이라는 멋진 노드 모듈이 있습니다. (- 아니 readdirSync 물건 예) 당신을 위해 여기에 보여지는 파일 시스템 물건을 많이한다. 예를 들면 다음과 같습니다.
편안한 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;
모든 것이 예상대로 작동했습니다. 이것이 누군가를 돕기를 바랍니다.
별도의 .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} `);
}
wf.foo
다른 제시된 솔루션과 같이 범위를 벗어 났기 때문에 등 으로 "전달"해야 합니까? app.js에서 분리되지 않은 경우 wf.foo의 공유 변수 / 함수에 일반적으로 액세스하는 경우를 언급하고 있습니다.
나는 이것을하기위한 작은 플러그인을 작성했다! 같은 코드를 반복해서 작성하는 데 어려움을 겪었습니다.
https://www.npmjs.com/package/js-file-req
도움이 되길 바랍니다.
이것은 아마도 가장 멋진 스택 오버플로 질문 / 답변 일 것입니다. 나는 사랑 위 샘의 / 브래드의 솔루션을. 내가 구현 한 비동기 버전으로 차임 할 것이라고 생각했습니다.
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);
}
}
});
}
});
}
내 디렉토리 구조는 약간 다릅니다. 필자는 일반적으로 app.js (프로젝트의 루트 디렉토리에 있음)에서 require
-ing 으로 경로를 정의 './routes'
합니다. 결과적으로 그 검사도 포함 시키고 싶기index.js
때문에 검사를 건너 뜁니다 .
편집 : 임의의 깊이의 폴더에 경로를 중첩 시키려면 이것을 함수에 넣고 재귀 적으로 호출 할 수 있습니다 (이 예제를 편집했습니다).
모든 라우트 기능을 다른 파일 (modules)에 넣고 기본 서버 파일에 링크 할 수 있습니다. 기본 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')
}
요청 메소드를 키로 사용하여 내보내고 값은 각각 경로 및 기능 키가있는 객체의 배열입니다.
module.exports = {
get: [{path:'/',func:login_screen}, {...} ],
post: [{path:'/login:forgotPassword', func:forgot_password}]
};