nodejs+koa 2 springMVC 프레임 워 크 모방 실현

11882 단어 nodejskoa2springMVC
koa2-MVC 구조
백 엔 드 기술 을 전면 에 내세 운다
환경:nodejs
개발 도구:Visual Studio Code(이하 VSC)
환경 설치,도구 설치 및 중국어자전거환경 조정 후 본론 으로 들 어가 기 시작 합 니 다.
1.하 드 디스크 에 폴 더 를 추가 하고 VSC 를 열 고'작업 영역 폴 더 추가'를 클릭 합 니 다.'페이지 사용'을 환영 하지 않 으 면-파일-새 창 을 클릭 합 니 다.효 과 는 다음 그림 과 같 습 니 다.


2.vsc 디 버 깅 추가.Shift+ctrl+p,입력 상자 에 입력:launch.json

방금 폴 더 선택


3.디 렉 터 리 구조

낮은 곳 에서 높 은 곳 까지 one by one
3-1、package.json

{
 "name": "koa2mcv",
 "version": "1.0.0",
 "description": "Hello Koa 2 example with MVC",
 "main": "app.js",
 "scripts": {
  "start": "node app.js"
 },
 "author": "baba",
 "dependencies": {
  "koa": "2.11.0",
  "koa-router": "8.0.8",
  "koa-bodyparser": "4.3.0",
  "koa-static-plus": "0.1.1",
  "koa-view": "2.1.3",
  "koa-jwt": "4.0.0",
  "koa-log4": "2.3.2",
  "jsonwebtoken": "8.5.1",
  "nunjucks": "3.2.1",
  "mime": "2.4.5",
  "mz": "2.7.0"
 }
}
매개 변수 소개:name 프로젝트 이름,version 버 전 번호,description 프로젝트 설명,main 프로젝트 시작 파일,scripts 시작 단축 설정,author 작성 자,dependencies 제3자 미들웨어 이름 및 버 전.
3-2、app.js

//    
require('./config/init').startServer();
관련 설정 을 시작 합 니 다.config/init.js 에 패키지 하고 시작 파일 을 직접 참조 하면 됩 니 다.
3-3,views html 페이지 저장
3-4,정적 파일 저장,css,js,font 등
3-5,src 저장 업무 제어,springMVC 의 contrller,service 와 유사 합 니 다.
3-6,config 는 핵심 프로필 을 저장 합 니 다.
3-6-1,init.js 프로젝트 의 핵심.
이상 우호 처리

function handler(){
 return async (ctx, next) => {

  const start = new Date().getTime();

  var urlReq=ctx.request.url;
  if(urlReq !== '/favicon.ico'){

   console.log(`    :${ctx.request.method} ${urlReq}`);
   try {

    let params =Object.assign({}, ctx.request.query, ctx.request.body);

    if(config["token"].excludeUrl.indexOf(urlReq) == -1 && !tokenFunction.varifyToken(params.token)){
     ctx.status =401;
    }else{
     await next();
    }
   } catch (error) {
    ctx.status=401;
    console.log(`  !    token  `);
   }finally{

     let err={};
     if(!ctx.status){
      err.status = 500;
     }else if(ctx.status==200){
      return;
     }else{
      err.status = ctx.status;
     }

     switch(err.status){
      case 404:
       err.url = config["server-name"]+'/static/public/404.html';
       err.message="     !";
       break;
      case 401:
       err.url = config["server-name"]+'/static/public/10000.html';
       err.message="    !     !";
       break;
      case 500:
       err.url = config["server-name"]+'/static/public/500.html';
       err.message="      !";
       break;
     }

     switch(ctx.request.type){
      case 'application/json':
       ctx.type = 'application/json';
       ctx.body = {errorCode:err.errorCode,message: err.message}
       break;
      default:

       ctx.type = 'text/html';
       ctx.redirect(err.url);
       break;
     }
   }
  }
  const ms = new Date().getTime() - start;
  console.log(`      : ${ms}ms`);
 }
}
경로 설정

function controller(){

 const router = new koaRouter({
  prefix: config["server-name"]
 });

 function findJsonFile(rootpathStr){

  fs.readdirSync(rootpathStr).forEach(function (item, index) {

   let fPath = path.join(rootpathStr,item);

   let stat = fs.statSync(fPath);

   if(stat.isDirectory() === true) {
    findJsonFile(fPath);
   }

   if (stat.isFile() === true&&fPath.endsWith('.js')) {

    var mapping = require(fPath);
    for (var url in mapping) {
     if (url.startsWith('GET ')) {
      router.get(url.substring(4), mapping[url]);
     } else if (url.startsWith('POST ')) {
      router.post(url.substring(5), mapping[url]);
     } else if (url.startsWith('PUT ')) {
      router.put(url.substring(4), mapping[url]);
     } else if (url.startsWith('DELETE ')) {
      router.del(url.substring(7), mapping[url]);
     }
     console.log(`   URL: ${url}`);
    }
   }
  });
 }

 findJsonFile(rootpath + 'src');
 return router.routes();
}
보기 렌 더 링

function templating() {
 var
  autoescape = config['templating-autoescape'] === null ? true : config['templating-autoescape'],
  noCache = config['templating-noCache'] === null ? false : config['templating-noCache'],
  watch = config['templating-watch'] === null ? false : config['templating-watch'],
  throwOnUndefined = config['templating-throwOnUndefined'] === null ? false :config['templating-throwOnUndefined'],
  env = new nunjucks.Environment(
   new nunjucks.FileSystemLoader(rootpath+'views', {
    noCache: noCache,
    watch: watch,
   }), {
    autoescape: autoescape,
    throwOnUndefined: throwOnUndefined
   });
 if (config['templating-filters'] != null) {
  for (var f in config['templating-filters']) {
   env.addFilter(f, config['templating-filters'][f]);
  }
 }
 return async (ctx, next) => {
  ctx.render = function (view, model) {
   ctx.response.body = env.render(view, Object.assign({}, ctx.state || {}, model || {}));
   ctx.response.type = 'text/html';
  };
  await next();
 };
}
구축 시작

function startServer(){

 const app = new koa();

 app.use(koaStaticPlus(rootpath+'static', {
  pathPrefix: config["server-name"]+'/static'
 })
 );
 
 app.use(koaBodyParser());
 
 app.use(handler());
 
 app.use(templating());
 
 app.use(controller());
 
 app.listen(config["server-port"]);

}
3-6-2,config.js 프로젝트 매개 변수 설정.

module.exports ={
 'server-name':'/koa',
 'server-port':3000,
 "templating-noCache":true,
 "templating-watch":true,
 "templating-autoescape":null,
 "templating-throwOnUndefined":null,
 "templating-filters":null,
 "token":{
  "excludeUrl":[
  "/koa/login",
  "/koa/dologin"
  ],
  "timeout":1000 * 60 * 60 * 24 * 7,
  "secret":"jiaobaba"
 }
 

}
3-6-3,token.js 프로젝트 token 관련 방법 패키지.

const jwt = require("jsonwebtoken");
const config = require('./config');
/**
 *   token   
 */
let createToken = (data)=>{
 let obj = {};
 //  token   
 obj.data = data || {};
 //token     
 obj.ctime = (new Date()).getTime();
 return jwt.sign(obj,config["token"].secret);
}
/**
 *   token       
 * @param {*} token 
 */
let varifyToken = (token)=>{
 let result = null;
 try{
  let {data,ctime,expiresIn} = jwt.verify(token,config["token"].secret);
  let nowTime = (new Date()).getTime();
  if(nowTime-ctime<config["token"].timeout){
   result = data;  
  }
 }catch(error){

 }
 return result;
}

module.exports = {
 createToken,
 varifyToken
};
3-6-4,logger.js 프로젝트 로그 설정 파일.
4.프로젝트 구조 구축 이 끝나 면 모든 의존 패 키 지 를 도입 하고 터미널 에서'npm install'을 실행 하면 package.json 에서 dependencies 모든 패 키 지 를 다운로드 하고 이 패 키 지 는 의존 하 는 패 키 지 를 다운로드 합 니 다.

실행 후 프로젝트 구조 에 두 개의 파일 이 추 가 됩 니 다.

5.테스트 용례 를 작성 하여 src 에서 hello.js 를 새로 만 듭 니 다.

//token
const token = require('../config/token');

var fn_hello = async (ctx, next) => {
 var name = ctx.params.name;
 ctx.response.body = `<h1>Hello, ${name}!</h1>`;
};


var fn_index = async (ctx, next) => {
 ctx.response.body = `<h1>Index</h1>
  <form action="/koa/signin" method="post">
   <p>Name: <input name="name" value=""></p>
   <p>Password: <input name="password" type="password"></p>
   <p><input type="submit" value="Submit"></p>
  </form>`;
};

var fn_signin = async (ctx, next) => {
 var
  name = ctx.request.body.name || '',
  password = ctx.request.body.password || '';
 console.log(`   : ${name},   : ${password}`);
  ctx.response.body = `<h1>Welcome, ${name}!</h1><br/>you token:<br/>${token.createToken({user: name,password: password})}`;
 
};

module.exports = {
 'GET /hello/:name': fn_hello,
 'GET /login': fn_index,
 'POST /dologin': fn_signin
};
6.시작 항목

시작 성공

테스트 접근:http://127.0.0.1:3000/koa/login

입력 값 가 져 오기 token


토 큰 을 가지 고 접근 하지 않 아 도 됩 니 다.

차단 성공
token 을 가지 고 접근 합 니 다.

테스트 성공!
nodejs+koa 2 가 springMVC 를 모방 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 nodejs+koa 2 springMVC 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기