一、创键项目

1.创建目录 koa2

2.npm init 创建 package.json,然后执行 npm install

3.通过 npm install koa 安装 koa 模块

4.通过 npm install supervisor 安装supervisor模块, 用于node热启动

5.在根目录下中新建 index.js 文件,作为入口文件, 内容如下:

const Koa = require('koa'); // Koa 为一个class

const app = new Koa();

app.use(async (ctx, next) => {

await next();

ctx.response.body = 'Hello, koa2!';

});

app.listen(9527, () => {

console.log('This server is running at http://localhost:' + 9527)

})

6.配置package

{

"name": "koa",

"version": "1.0.0",

"description": "",

"main": "koa.js",

"scripts": {

"serve": "supervisor koa.js"

},

"author": "",

"license": "ISC",

"dependencies": {

"koa": "^2.7.0",

"supervisor": "^0.12.0"

}

}

7 . 启动

npm run serve

二、路由配置

cnpm i koa-router

const router = new Router(); // 实例化路由

router.get('/', async (ctx, next) => {

ctx.response.body = '

好家伙

';

});

app.use(router.routes());

路由参数

//请求地址 www.*****/sss?from=1

router.get('/hello/:name', async (ctx, next) => {

var name = ctx.params.name; // 获取请求参数 sss

var from = ctx.query.from; // 1

ctx.response.body = `

好家伙, ${name}!

`;

});

三、请求

post

const bodyParser = require('koa-bodyparser');

app.use(bodyParser());

router.post('/login', async (ctx, next) => {

let name = ctx.request.body.name;

let password = ctx.request.body.password;

console.log(name, password);

ctx.response.body = `

好家伙, ${name}!

`;

});

get

router.get('/', async (ctx, next) => {

ctx.response.body = '

好家伙

'

});

四、html模板

1、好处

使用html模板,将html从js中分离出去,有助于项目开发和管理。而且,html模板在koa2中,必须通过中间件来实现。

2、koa-views + nunjucks实现html模板

nunjucks.configure(resolve(__dirname, 'views'), { autoescape: true });

app.use(views(__dirname + '/views', {

map: { html: 'nunjucks' }

}));

五、操作静态资源

1、静态资源在开发中的地位

静态资源环境在服务端是十分常用的一种服务,在后台开发中不仅有需要代码处理的业务逻辑请求,也会有很多的静态资源请求。比如请求js,css,jpg,png这些静态资源请求。也非常的多,有些时候还会访问静态资源路径。

2、koa-static-cache实现静态资源操作

app.use(

staticCache(resolve("dist"), {

maxAge: 365 * 24 * 60 * 60

})

)

六、进阶

1、结构

入口文件(index.js)

const Koa = require('koa')

const bodyParser = require('koa-bodyparser');

const staticCache = require('koa-static-cache');

const views = require('koa-views')

const {resolve} = require('path')

const R = require('ramda')

const MIDDLEWARES = ['router'] //中间件配置文件

const nunjucks = require('nunjucks')

const logsUtil = require('../utils/logs.js');

//中间件导入 路由导入

const useMiddlewares = (app) => {

R.map(

R.compose(

R.forEachObjIndexed(

initWith => initWith(app)

),

require,

name => resolve(__dirname, `./middlewares/${name}`)

)

)(MIDDLEWARES)

}

;(async () => {

const app = new Koa();

// view engine setup

nunjucks.configure(resolve(__dirname, 'views'), { autoescape: true });

//views with nunjucks

app.use(views(__dirname + '/views', {

map: { html: 'nunjucks' }

}));

app.use(bodyParser());

app.use(logsUtil.accessInfo()); //访问日志

//静态资源配置缓存

app.use(

staticCache(resolve("dist"), {

maxAge: 365 * 24 * 60 * 60

})

)

app.on('error', err => {

});

app.use(async (ctx,next) => {

await next()

if(parseInt(ctx.status) === 404){

ctx.response.redirect("/404")

}

});

await useMiddlewares(app) //导入中间件

app.listen(9527,() => {

console.log('Server running on port %d', 9527);

})

})()

2、路由中间件封装

1.新建middlewares文件夹   在下面新建router.js

2.新建lib文件夹 在下面新建decorator.js

3.新建routes下面新建views.js

router.js

const { Route } = require('../lib/decorator')

const { resolve } = require('path')

export const router = app => {

const apiPath = resolve(__dirname, '../routes')

const router = new Route(app, apiPath);

router.init()

}

decorator.js

const Router = require('koa-router')

const { resolve } = require('path')

const _ = require('lodash')

const glob = require('glob')

const R = require('ramda')

const symbolPrefix = Symbol('prefix')

const routerMap = new Map()

const isArray = c => _.isArray(c) ? c : [c]

export class Route {

constructor (app, apiPath) {

this.app = app

this.apiPath = apiPath

this.router = new Router()

}

init () {

glob.sync(resolve(this.apiPath, './**/*.js')).forEach(require)

for (let [conf, controller] of routerMap) {

const controllers = isArray(controller)

let prefixPath = conf.target[symbolPrefix]

if (prefixPath) prefixPath = normalizePath(prefixPath)

const routerPath = prefixPath + conf.path

this.router[conf.method](routerPath, ...controllers)

}

this.app.use(this.router.routes())

this.app.use(this.router.allowedMethods())

}

}

const normalizePath = path => path.startsWith('/') ? path : `/${path}`

const router = conf => (target, key, descriptor) => {

conf.path = normalizePath(conf.path)

routerMap.set({

target: target,

...conf

}, target[key])

}

export const controller = path => target => (target.prototype[symbolPrefix] = path)

export const get = path => router({

method: 'get',

path: path

})

export const post = path => router({

method: 'post',

path: path

})

export const put = path => router({

method: 'put',

path: path

})

export const del = path => router({

method: 'delete',

path: path

})

export const use = path => router({

method: 'use',

path: path

})

export const all = path => router({

method: 'all',

path: path

})

view.js

const { controller, get } = require('../lib/decorator')

@controller('')

export class viewController {

@get('/')

async home(ctx, next) {

await ctx.render('index', {

})

}

@get('/service')

async enter(ctx, next) {

await ctx.render('service', {

title: '',

})

}

@get('/404')

async pageNUll(ctx, next) {

await ctx.render('404', {

title: ' ',

})

}

}

3、日志文件

cnpm i koa-log4

config/logs.jsvar path = require('path');

//日志根目录

var baseLogPath = path.resolve(__dirname, '../logs')

/*报错输出日志*/

//错误日志目录、文件名、输出完整路径

var errorPath = "/error";

var errorFileName = "error";

var errorLogPath = baseLogPath + errorPath + "/" + errorFileName;

/*请求数据得到响应时输出响应日志*/

//响应日志目录、文件名、输出完整路径

var responsePath = "/response";

var responseFileName = "response";

var responseLogPath = baseLogPath + responsePath + "/" + responseFileName;

/*操作数据库进行增删改等敏感操作记录日志*/

//操作日志目录、文件名、输出完整路径

var handlePath = "/handle";

var handleFileName = "handle";

var handleLogPath = baseLogPath + handlePath + "/" + handleFileName;

/*访问级别日志*/

var accessPath = "/access"

var accessFileName = "access";

var accessLogPath = baseLogPath + accessPath + "/" + accessFileName;

/*访问级别日志*/

var reqPath = "/req"

var reqFileName = "req";

var reqLogPath = baseLogPath + reqPath + "/" + reqFileName;

module.exports = {

//日志格式等设置

appenders:

{

"rule-console": {"type": "console"},

"errorLogger": {

"type": "dateFile",

"filename": errorLogPath,

"pattern": "-yyyy-MM-dd.log",

"alwaysIncludePattern": true,

"encoding": "utf-8",

"path": errorPath

},

"resLogger": {

"type": "dateFile",

"filename": responseLogPath,

"pattern": "-yyyy-MM-dd.log",

"alwaysIncludePattern": true,

"encoding": "utf-8",

// "maxLogSize": 204800,

// "numBackups": 3,

"path": responsePath

},

"handleLogger": {

"type": "dateFile",

"filename": handleLogPath,//生成文件路径和文件名

"pattern": "-yyyy-MM-dd.log",

"alwaysIncludePattern": true,

"encoding": "utf-8",

// "maxLogSize": 204800,

// "numBackups": 3,

"path": handlePath

},

"accessLogger": {

"type": "dateFile",

"filename": accessLogPath,

"pattern": "-yyyy-MM-dd.log",

"alwaysIncludePattern": true,

"encoding": "utf-8",

// "maxLogSize": 204800,

// "numBackups": 3,

"path": accessPath

},

"reqLogger": {

"type": "dateFile",

"filename": reqLogPath,

"pattern": "-yyyy-MM-dd.log",

"alwaysIncludePattern": true,

"encoding": "utf-8",

// "maxLogSize": 204800,

// "numBackups": 3,

"path": reqPath

},

},

//供外部调用的名称和对应设置定义

categories: {

"default": {"appenders": ["rule-console"], "level": "all"},

"resLogger": {"appenders": ["resLogger"], "level": "info"},

"errorLogger": {"appenders": ["errorLogger"], "level": "error"},

"handleLogger": {"appenders": ["handleLogger"], "level": "all"},

"accessLogger": {"appenders": ["accessLogger"], "level": "all"},

"reqLogger": {"appenders": ["reqLogger"], "level": "error"}

},

"baseLogPath": baseLogPath

}

log.js

var log4js = require('koa-log4');

var logsConfig = require('../config/logs.js');

//加载配置文件

log4js.configure(logsConfig);

//调用预先定义的日志名称

var resLogger = log4js.getLogger("resLogger");

var errorLogger = log4js.getLogger("errorLogger");

var handleLogger = log4js.getLogger("handleLogger");

var reqLogger = log4js.getLogger("reqLogger");

var consoleLogger = log4js.getLogger();

exports.accessInfo = () => log4js.koaLogger(log4js.getLogger('accessLogger'));//访问日志

exports.logInfo = (data) => {consoleLogger.info(data)}

.............

.............

关于pm2自动部署   webpack打包  以及数据库后续有时间更新

欢迎干饭人一起推动优化

到此这篇关于node koa2 ssr项目搭建的方法步骤的文章就介绍到这了,更多相关node koa2 ssr项目搭建内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

koa 设置cache_node koa2 ssr项目搭建的方法步骤相关推荐

  1. windows server 2019 服务器搭建的方法步骤(图文)

    一.windows server 2019 安装 Vmware 下安装 windows server 2019 . 二.服务器配置 1. 先启用远程功能 右键点击[此电脑]–[属性],进入" ...

  2. 微软关闭交互式服务器,交互式服务检测是什么?设置关闭交互式服务检测窗口的方法步骤...

    谈到交互式服务检测,可能一些用户还不清楚这是什么,它其实是microsoft windows对windows vista以前的交互式服务在windows vista及以后的操作系统中无法正常工作的问题 ...

  3. 三菱FX5U与西门子S7-1200通过简单CPU通信设置实现以太网通信功能的具体方法步骤

    三菱FX5U与西门子S7-1200通过简单CPU通信设置实现以太网通信功能的具体方法步骤 1. 准备工作 硬件:FX5U系列PLC,S7-1200系列PLC,以太网交换机(可选) 软件:三菱GX WO ...

  4. mysql 无线网络设置_操作mysql命令行的方法步骤

    操作mysql命令行的方法步骤 现在向大家介绍mysql命令行下,从数据库的建立到表数据的删除全过程,希望对大家有所帮助. 登陆mysql 打cmd命令终端,如果已经添加了mysql的环境变量,可以直 ...

  5. express项目搭建 初始化详细步骤

    案例 一.对每一个POST请求都设置CSRF防护 实际上,不仅仅转账需要CSRF防护,每一个post请求都需要做csrf的防护措施. webA项目中的app.js: const router = ex ...

  6. java实现分布式项目搭建的方法

    1 分布式 1.1 什么是分布式 分布式系统一定是由多个节点组成的系统.其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的. 这些连通的节点上部署了我们的节点,并且相互的操作会有协同 ...

  7. 自学uni-app (7)项目搭建的详细步骤、注意事项和遇到的问题

    跨平台框架uni-app 步骤 一.需求分析 二.功能分析 三.多页面应用搭建 1.创建新页面 2.注册新页面 四.添加组件 1.添加组件 2.导入组件 3.注册组件 4.使用注册的组件 五.基本布局 ...

  8. win11如何设置始终以管理员身份运行 windows11设置始终以管理员身份运行的方法步骤

    在WindowsTerminal上,您现在可以选择始终以管理员身份自动运行命令提示符和其他配置文件,无论您使用的是Windows11还是Windows10.尽管始终建议在不提升权限的情况下运行命令提示 ...

  9. 惠普linux进入bios设置u盘启动,hp惠普笔记本进入bios设置u盘启动装系统的方法步骤详细教程 - 系统家园...

    我们在使用惠普笔记本电脑的时候,有的小伙伴可能因为我们的电脑出现了一些故障问题需要重装自己的操作系统.如果想要用U盘启动的方式来进行装机的话,对于hp惠普笔记本怎么进入bios设置u盘启动装系统的问题 ...

最新文章

  1. 遍历百万级Redis的键值的大结局
  2. android gradle.properties
  3. NSTimer 小记
  4. ONVIF C++ 库
  5. This graphics driver could not find compatible graphics hardware 解决
  6. SpringCloud中Feign的适配器的实现方案
  7. python openpyxl模块追加数据_python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据...
  8. DataTable 深入解析数据源绑定原理之高级篇
  9. restful 风格api
  10. 基于java的铁路火车售票系统
  11. java网店系统 开源_网店系统javashop发布其开源框架,遵循GPL协议
  12. Scrum敏捷开发流程
  13. 乡镇政府网络智能办公系统(乡镇OA)应用【乡镇信息化经验】
  14. html ckplayer.swf,Flash基础入门之ckplayer.js视频播放插件
  15. Excel表格中如何换行
  16. 【工具推荐】下载github部分文件
  17. 分机号 —— 蓝桥杯
  18. 其实嵌入式编程还是很难很复杂的
  19. [个人笔记]HCIP-Routing Switching-IEEP/H12-223
  20. 堆外缓存OHCache使用总结

热门文章

  1. 爬虫漫游指南:无头浏览器puppeteer的检测攻防
  2. 新一代互联网技术——可信网络
  3. 牛奶面包计算机音乐,小班音乐:牛奶面包
  4. 正式为自己起英文名小小龙(Alfie)
  5. 《脱颖而出——成功网店经营之道》一1.6 电商通常都会聚集在这几个地方
  6. Mac视频剪辑三件套Final Cut Pro X 10.6.3+ Motion 5.6.1+Compressor 4.6.1安装教程
  7. stm32独立看门狗和rtc闹钟
  8. 「GoCN酷Go推荐」重试工具 — retry-go
  9. 深圳所有狗植入芯片,有助于减少流浪狗,芯片至少可以使用15年
  10. 【计算机毕业设计】酒店管理系统