nodejs+koa 2 springMVC 프레임 워 크 모방 실현
백 엔 드 기술 을 전면 에 내세 운다
환경: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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Node.js를 AWS서버에서 사용하는 실습간단한 예제와 함께 AWS에서 Node.js를사용하는 법을 배워보도록 하겠다. 해당 github에 있는 레포지토리로 사용을 할 것이다. 3000번 포트로 Listen되는 예제이고 간단히 GET, POST, DELET...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.