什么是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 文件夹。