node.js+koa.js

717 阅读5分钟

什么是nodejs?

脚本语言需要一个解析器才能运行,JavaScript是脚本语言,在不同的位置有不一样的解析器,如写入html的js语言,浏览器是它的解析器角色。而对于需要独立运行的JS,nodejs就是一个解析器,运行在nodejs中的js的用途是操作磁盘文件或搭建http服务器,nodejs就相应提供了fs,http等内置对象。

Koa?

Koa 是一个新的 web 框架,通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

一、Koa安装

创建一个空白目录,然后进入终端,并在终端对koa进行安装:

# 项目初始化
npm init -y

# 安装koa
npm i koa -S

二、入口文件

在项目根目录创建 app.js 文件,并在上一步操作中生成的 package.json 里配置:

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node app.js"
  },
}

app.js 中:

const Koa = require('koa');
const app = new Koa();
const port = 9000;

/* 
	每收到一个http请求,koa就会调用通过app.use()注册的async函数,并传入ctx和next参数
*/

app.use(async (ctx, next)=>{
    ctx.body = "Hello, Koa";
})

app.listen(port, ()=>{
    console.log('Server is running at http://localhost:'+port);
})

然后运行 npm start ,并在浏览器输入 http://localhost:9000/ 即可看到页面效果。

三、洋葱模型

学Koa必须要了解 洋葱模型 :

Koa是从第一个中间件按照顺序开始执行,遇到 next 进入下一个中间件,一直执行到最后一个中间件,在逆序,执行上一个中间件 next 之后的代码,一直到第一个中间件执行结束才发出响应。

const Koa = require('koa');
const app = new Koa();
const port = 9000;

app.use(async (ctx, next)=>{
    console.log(1)
    await next();
    console.log(1)
})

app.use(async (ctx, next)=>{
    console.log(2)
    await next();
    console.log(2)
})

app.use(async (ctx)=>{
    console.log(3)
})

app.listen(port, ()=>{
    console.log('Server is running at http://localhost:'+port);
})

那么在浏览器刷新后,控制台得到的顺序是:

1
2
3
2
1

现在可以看到,我们通过 next可以先运行下个中间件,等中间件结束后,再继续运行当前 next() 之后的代码。

四、路由安装

当需要匹配不同路由时,可以安装:

npm i koa-router

app.js 修改:

const Koa = require('koa');
const app = new Koa();
const router = require('koa-router')()
const port = 9000;

router.get('/', async (ctx)=>{
    ctx.body = "首页";
})

router.get('/list', async (ctx)=>{
    ctx.body = "列表页";
})


app.use(router.routes(), router.allowedMethods());

app.listen(port, ()=>{
    console.log('Server is running at http://localhost:'+port);
})

此时,到浏览器刷新并在地址栏最后添加 /list 即可得到首页和列表页。

备注:

// 调用router.allowedMethods()获得一个中间件,当发送了不符合的请求时,会返回 `405 Method Not Allowed` 或 `501 Not Implemented`

allowedMethods方法可以做以下配置:
app.use(router.allowedMethods({ 
    // throw: true, // 抛出错误,代替设置响应头状态
    // notImplemented: () => '不支持当前请求所需要的功能',
    // methodNotAllowed: () => '不支持的请求方式'
}))

五、路由拆分

有时候我们需要拆分路由,比如:

列表页下所有的子路由(即前端请求的api)与首页所有的子路由想分开处理,那么就需要拆分路由。

六、操作数据库了

Sequelize 是一个基于 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有强大的事务支持,关联关系、读取和复制等功能。

ORM是指对象关系映射,通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。

一:安装

npm i sequelize -S
// 使用哪种数据库选择不同的安装
npm i mysql2 -S

二:数据库连接测试

const Sequelize = require('sequelize');
  // 第一个参数是数据库名,第二个参数是数据库用户名,第三个参数密码
  // 第四个参数配置参数 包括地址,数据库类型等
const sequelize = new Sequelize('list', 'root', '123456', {
  host: 'localhost',
  dialect: 'mysql'
});
// 测试是否连接函数
sequelize.authenticate()
  .then(() => {
    console.log('连接成功');
    console.log("hello");
  })
  .catch(err => {
    console.log(err);
  })

三:定义模型

用来表述(描述)数据库表字段信息的对象,每一个模型对象表示数据库中的一个表,后续对数据库的操作都是通过对应的模型对象来完成的。

modelName:模型名称,自定义         

attributes:模型中包含的数据,每一个数据映射对应表中都每一个字段         

options:模型(表)的设置

四:表的增删改

增:
let result = await User.create({
    name,
    password
});
删除:
let result = await List.destroy({
   where:{
       _id:id
   }
});
更新:
let result = await List.update({
    name:"小明"
},{
    where:{
        _id:id
    }
});
查:
let result = await List.findAll({
    offset: 2
});

七、后端允许跨域

前端想跨域,可以设置proxy。如果后端允许跨域,可以如下操作:

// 安装koa2-cors
cnpm i koa2-cors

// 这里cors中间件一定要写在路由之前
app.use(cors());
app.use(router.routes(), router.allowedMethods())

八、读取静态资源文件

首先,在项目的根目录下创建 assets 后,将图片资源文件夹 images 放到其中,并且执行以下操作:

// 安装koa-static
cnpm install koa-static

// 引入
const path = require('path')
const static = require('koa-static')

// 获取静态资源文件夹
app.use(static(path.join(__dirname+'/assets')));
...
app.use(router.routes(), router.allowedMethods())

假设其中有一张图片叫做 banner1.png,那么我们打开浏览器,访问:http://localhost:5050/images/banner1.png 即可得到图片。这里注意:

路径上不需要写assets,因为我们已经指定了访问资源时, http://localhost:5050 自动指向 assets 文件夹。