Node. js 사용자 정의 경로
6957 단어 Nodejs
app. js 파일 에 서 는 경로 에 요청 한 URL 을 자주 사용 합 니 다.
app.use('/index', require('../index.js'))
프로젝트 가 점점 커지 고 app 엔 드 의 요청 포트 도 여러 버 전 을 교체 하여 v 1.0 에서 v 5.0 으로 업그레이드 되 었 습 니 다.그러면 app. js 가 비대 해 지고 유지 하기 어 려 울 수 있 습 니 다.마지막 까지 app. js 가 이렇게 될 수 있 습 니 다.
app.use('/v1_0/index', require('../index1.js'))
app.use('/v1_1/index', require('../index2.js'))
app.use('/v1_2/index', require('../index3.js'))
... 47
app.use('/v5_0/index', require('../index50.js'))
그렇다면 이 구 조 를 어떻게 최적화 할 것 인가?Node. js 의 경로 표를 만 들 고 업무 논 리 를 contrller 에 두 며 모든 재 활용 버 전 방법 은 같은 contrller 의 방법 을 가리킨다.
index. js 파일 에서 자주 사용 하 는 구조 가 이 렇 습 니 다.
const express = require('express');
const router = express.Router();
router.get('/', async (req, res, next) => {
res.render('index');
});
module.exports = router;
app. use () 가 사용 하 는 require ('.. / index 1. js') 를 볼 수 있 습 니 다. 실제로 내 보 낸 router 대상 입 니 다.그러면, 우 리 는 스스로 루트 테이블 규칙 을 정 하고, 루트 대상 의 get / post 등 과정 을 작성 해서, 마지막 으로 이 루트 를 app. js 에 내 보 낼 수 있 습 니까?
1. 라 우 터 루트 테이블 작성
router. js 를 routers 디 렉 터 리 에 만 듭 니 다.
'use strict';
/**
*
* Created by davidqin on 2017/11/1.
*/
module.exports = {
/**
* admin
*/
'/admin': {},
/**
*
* :/operation/post_article/categories-add
* :post
* :article_controller
* :addCategories
*/
'/operation': {
'/post_article':[
'/categories-add.post.article_controller.addCategories',
'/categories-list.get.article_controller.getCategories',
'/categories-delete.delete.article_controller.deleteCategories',
'/categories-edit.put.article_controller.editCategories',
'/author-add.post.article_controller.addAuthor',
'/author-delete.delete.article_controller.deleteAuthor',
'/author-edit.put.article_controller.editAuthor',
'/author-password.put.article_controller.editAuthorPassword',
'/author-fetch.get.article_controller.fetchAuthor',
'/author-list.get.article_controller.listAuthor',
'/articles-list.get.article_controller.listArticles',
'/article-detail.get.article_controller.detailArticle',
'/article-add.post.article_controller.addArticle',
'/article-edit.put.article_controller.editArticle',
'/article-delete.delete.article_controller.deleteArticle',
],
'/article_comment':[
'/list.get.article_comment_controller.listComments',
'/add.post.article_comment_controller.addComment',
'/delete.delete.article_comment_controller.deleteComment'
]
},
/**
* APP v1.1 API
*/
'/v1_1':{
'/wikis':[
'/list.post.article_controller.listArticles',
'/detail.post.article_controller.detailArticle'
],
'/wiki-comment':[
'/add.post.article_comment_controller.addComment',
'/list.get.article_comment_controller.listComments',
'/delete.post.article_comment_controller.deleteComment'
],
'/timeday':[
'/list.get.timeday_controller.listTimeday',
'/delete.post.timeday_controller.deleteTimeday',
'/add.post.timeday_controller.addTimeday'
]
}
};
2. 루트 테이블 분석
루트 테이블 을 만 든 후 가장 중요 한 것 은 루트 테이블 의 정 보 를 어떻게 해석 하고 루트 대상 에 게 사용 하 는 지 입 니 다.최종 적 으로 router 대상 을 내 보 냅 니 다.
생 성 routermap. js 는 routers 디 렉 터 리 에 있 습 니 다.
'use strict';
/**
* ,require controller -
* Created by davidqin on 2017/11/1.
*/
const router = require('express').Router();
const routerTable = require('./router');
const _ = require('lodash');
(function loop(map) {
_.forEach(map, function (value, key) {
let controller1;
controller1 = key;
_.forEach(value, function (value2, key2) {
let controller2 = controller1;
controller2 += key2;
for (var i = 0; i < value2.length; i++) {
let controller3 = controller2;
let value3 = value2[i];
let arr = value3.split('.');
controller3 += arr[0];
let method = arr[1];
let path = '../controllers/' + arr[2] + '.js';
let fuc = arr[3];
let controllerRegistry = require(path);
let action;
for (let actionChild in controllerRegistry) {
if (actionChild === fuc) {
action = actionChild;
}
}
console.log(method, controller3, action);
router[method](controller3,controllerRegistry[action]);
}
});
});
}(routerTable));
module.exports = router;
인쇄 된 결 과 는 다음 과 같 습 니 다.
post /operation/post_article/categories-add addCategories
get /operation/post_article/categories-list getCategories
delete /operation/post_article/categories-delete deleteCategories
put /operation/post_article/categories-edit editCategories
post /operation/post_article/author-add addAuthor
delete /operation/post_article/author-delete deleteAuthor
put /operation/post_article/author-edit editAuthor
put /operation/post_article/author-password editAuthorPassword
get /operation/post_article/author-fetch fetchAuthor
get /operation/post_article/author-list listAuthor
get /operation/post_article/articles-list listArticles
get /operation/post_article/article-detail detailArticle
post /operation/post_article/article-add addArticle
put /operation/post_article/article-edit editArticle
delete /operation/post_article/article-delete deleteArticle
get /operation/article_comment/list listComments
post /operation/article_comment/add addComment
delete /operation/article_comment/delete deleteComment
post /v1_1/wikis/list listArticles
post /v1_1/wikis/detail detailArticle
post /v1_1/wiki-comment/add addComment
get /v1_1/wiki-comment/list listComments
post /v1_1/wiki-comment/delete deleteComment
get /v1_1/timeday/list listTimeday
post /v1_1/timeday/delete deleteTimeday
post /v1_1/timeday/add addTimeday
세 번 째 매개 변 수 는 방법 명 입 니 다.routers 폴 더 동급 디 렉 터 리 에 controllers 폴 더 를 만 들 고 articlecontroller. js (루트 테이블 의 컨트롤 러 이름과 일치 함).
3. 컨트롤 러 작성
article 생 성controller. js, controllers 디 렉 터 리 에 있 습 니 다.
exports.addCategories = async (req, res, next) =>{
res.send("1");
}
요청 이 있 으 면 post / operation / postarticle / categories - add 시 이 방법 에 들 어 갑 니 다.루트 테이블 에서 정의 하기 만 하면 여러 요청 URL 에서 이 방법 을 가리 킬 수 있 습 니 다.
4. app. js 에서 참조
const router_map = require('./server/routes/router_map');
app.use('/',router_map);
해결 하 다.