摘要:路由封装了和变量传入将要处理的下一个异步函数由标记的函数称为异步函数,在异步函数中,可以用调用另一个异步函数,这两个关键字将在中引入。
koa2.x learning 路由 koa-router
const router = require("koa-router")()
ctx:封装了request 和 response变量
next: 传入将要处理的下一个异步函数
由async标记的函数称为异步函数,在异步函数中,可以用await调用另一个异步函数,这两个关键字将在ES7中引入。
${ctx.request.url} 输出 请求的url 地址 ctx.url相当于ctx.request.url,ctx.type相当于ctx.response.type
处理路由器的操作分为:views、 string、 json、 处理get请求、 处理post请求
viewsrouter.get("/", async (ctx, next) => {
await ctx.render("index", {
title: "Hello Koa 2!"
})
})
string
router.get("/string",async (ctx, next) =>{
ctx.response.body = `welcome, hello
`;
})
json
router.get("/json", async (ctx, next) => {
ctx.body = {
title: "koa2 json"
}
})
处理get请求
var name = ctx.params.name;
router.get("/info/:name", async (ctx, next) => {
var name = ctx.params.name;
ctx.response.body = `Hello, ${name}!
`;
})
处理post请求
var name = ctx.request.body.name || "";
需要引入 koa-bodyparser 中间件, 创建 info.pug 用于处理表单
extends layout
block content
h1= title
form(action="/signin" method="post")
p= "用户名:"
input(type="text" name="name" value="koa")
p= "密码:"
input(type="password" name="password" value="koa")
p
input(type="submit" value="提交")
router.get("/info", async (ctx, next) => {
await ctx.render("info",{
title: "用户信息"
});
})
// 处理post请求
router.post("/signin", async (ctx,next) => {
var name = ctx.request.body.name || "";
var password = ctx.request.body.password || "";
if(name === "koa" && password === "koa") {
ctx.response.body = `welcome, ${name}
`;
}else{
ctx.response.body = `Login faild!
`
}
})
视图 - views层
适用于 koa 的模板引擎选择非常多,比如 jade、ejs、nunjucks、handlebars 、xtemplate 等。
Nunjucks是Mozilla开发的一个纯JavaScript编写的模板引擎 koa-nunjucks-2^3.0.2
https://mozilla.github.io/nun...
const koaNunjucks = require("koa-nunjucks-2")
app.use(koaNunjucks({
ext: "html",
path: path.join(__dirname, "views"),
nunjucksConfig: {
trimBlocks: true,
noCache: false // 开发环境下
}
}));
// 模块
{% extends "base.html" %}
{% block body %} No body {% endblock %}
// 循环
{% for msg in data %}
{{ msg }}
{% endfor %}
{% if hungry %}
I am hungry
{% elif tired %}
I am tired
{% else %}
I am good!
{% endif %}
操作cookie
koa提供了从上下文直接读取、写入cookie的方法:
ctx.cookies.get(name, [options]) 读取上下文请求中的cookie
ctx.cookies.set(name, value, [options]) 在上下文中写入cookie
// 处理cookie
router.get("/cookie", async (ctx,next) => {
const options = {
domain:"127.0.0.1",
path:"/",
maxAge: 10 * 60 * 1000, // cookie有效时长
expires: new Date("2019-02-02"), // cookie失效时间
httpOnly: false, // 是否只用于http请求中获取
overwrite: false // 是否允许重写
}
ctx.cookies.set("id","test cookie",options)
ctx.response.body = `cookies, ${ctx.cookies.get("id")}
`; // 输出cookie值
})
操作session
将session存放在MySQL数据库中 koa-session-minimal、koa-mysql-session "koa-session-minimal":"^3.0.4","koa-mysql-session":"^0.0.2"
const session = require("koa-session-minimal")
const MysqlSession = require("koa-mysql-session")
// 配置存储session
let store = new MysqlSession({
user: "root",
password: "",
database: "test",
host: "127.0.0.1",
})
let cookie = {
maxAge: "", // cookie有效时长
expires: "", // cookie失效时间
path: "", // 写cookie所在的路径
domain: "", // 写cookie所在的域名
httpOnly: "", // 是否只用于http请求中获取
overwrite: "", // 是否允许重写
secure: "",
sameSite: "",
signed: "",
}
app.use(session({
key: "SESSION_ID",
store: store,
cookie: cookie
}))
// 处理session
router.get("/session", async (ctx,next) => {
ctx.session = {
user_id: Math.random().toString(36).substr(2),
count: 0
}
ctx.response.body = `session, ${ctx.session.user_id}, ${ctx.session.count}
`; // 输出cookie值
})
操作mysql
安装 mysql "mysql":"^2.15.0"
用户增、删、改、查
// 查询
async function queryAll(){
let sql = usersMapping.queryAll;
let UsersList = await dbUtils(sql);
return UsersList;
}
// 新增
async function insertUser(username,password,realname){
let sql = usersMapping.insertUser;
var values = [username,password,realname]; // 数组
let result = await dbUtils(sql,values);
if ( Array.isArray(result) && result.length > 0 ) {
result = result[0]
} else {
result = null
}
return result
}
// 修改
async function queryById(id){
let sql = usersMapping.queryById;
let result = await dbUtils(sql,id);
if ( Array.isArray(result) && result.length > 0 ) {
result = result[0]
} else {
result = null
}
return result
}
async function updateUser(id,username,password,realname){
// 从session中取 id
let sql = usersMapping.updateUser;
var values = [username,password,realname,id]; // 数组
let result = await dbUtils(sql,values);
if ( Array.isArray(result) && result.length > 0 ) {
result = result[0]
} else {
result = null
}
return result
}
// 删除
async function deleteById(id){
let sql = usersMapping.deleteById;
let flag = await dbUtils(sql,id);
return flag;
}
github:
https://github.com/lichuang44...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/93104.html
摘要:用搭建前端项目用搭建后台,给前端提供数据访问接口项目结构用搭建的项目,红色框中是新建的文件夹用于存放剩下的文件在写项目中慢慢增加,最初就是这样的之后将项目跑起来,看一下有没有问题这里就当作没有问题前端这里选用和搭配这里采用的是的完整 koa2+vue 用vue-cli搭建前端项目 用koa2搭建后台,给前端提供数据访问接口 项目结构 showImg(https://segmentf...
摘要:接上次挖的坑,对相关的源码进行分析第一篇。和同为一批人进行开发,与相比,显得非常的迷你。在接收到一个请求后,会拿之前提到的与来创建本次请求所使用的上下文。以及如果没有手动指定,会默认指定为。 接上次挖的坑,对koa2.x相关的源码进行分析 第一篇。 不得不说,koa是一个很轻量、很优雅的http框架,尤其是在2.x以后移除了co的引入,使其代码变得更为清晰。 express和ko...
摘要:返回的结果是一个对象,类似于表示本次后面执行之后返回的结果。对象用于一个异步操作的最终完成或失败及其结果值的表示简单点说就是处理异步请求。源码分析主要脉络函数调用后,返回一个实例。参考链接解释对象的用法的源码及其用法 本文始发于我的个人博客,如需转载请注明出处。为了更好的阅读体验,可以直接进去我的个人博客看。 前言 知识储备 阅读本文需要对Generator和Promise有一个基本的...
摘要:目前这个爬虫还是比较简单的类型的,直接抓取页面,然后在页面中提取数据,保存数据到数据库。总结写这个项目其实主要的难点在于程序稳定性的控制,容错机制的设置,以及错误的记录,目前这个项目基本能够实现直接运行一次性跑通整个流程。 前言 之前研究数据,零零散散的写过一些数据抓取的爬虫,不过写的比较随意。有很多地方现在看起来并不是很合理 这段时间比较闲,本来是想给之前的项目做重构的。后来 利用这...
阅读 4048·2023-04-25 18:41
阅读 1464·2021-11-11 16:55
阅读 2067·2021-09-22 15:54
阅读 3298·2021-09-22 15:51
阅读 3749·2019-08-30 15:55
阅读 2166·2019-08-30 14:19
阅读 1554·2019-08-29 10:57
阅读 1904·2019-08-29 10:56