1、初始化项目
npm init
- 新建一个空文件夹,作为项目的根目录
- 在这个根目录下 npm init
- 生成package.json
2、安装koa依赖
npm i koa
3、安装koa-router(根据需求看是否需要使用koa-router)
npm i koa-router
4、搭建简单的本地服务(全局app.js简单书写)
const koa = require('koa')
const router=new Router()
const app=new koa()
app.use(router.routes())
router.get('/',(ctx,next)=>{
ctx.body='hello world'
})
//匹配出现路由出现的东西
app.listen(3000,()=>{
console.log(`server is started at port 3000`)
})
//监听一个3000的端口
5、连接数据库
- 在App.js的同级目录下新建config.js文件
- config.js的书写
const CONF = {
port: '5757',
mysql: {
host: 'localhost',
port: 3306,
user: 'root',
db: 'nodemysql',
pass: '123456',
char: 'utf8mb4'
}
}
module.exports = CONF
- 在App.js的同级目录下新建mysql.js文件
- mysql.js的书写
// 获取基础配置
const configs = require('./config') //导入config模块
// Knex.js是为MySQLd等等,SQL查询构建器,其设计灵活,便于携带并且使用起来非常有趣。
var knex = require('knex') ({//使用knex,连接mysql数据库
client: 'mysql',
connection: {
host: configs.mysql.host,
port: configs.mysql.port,
user: configs.mysql.user,
password: configs.mysql.pass,
database: configs.mysql.db,
}
})
//将基础配置和sdk.config合并 导出初始化完成的sdk sdk(软件开发工具包)
module.exports={mysql:knex}
6、封装组件工作
6.1 - 封装Router组件
- 为了简单明了,更加组件化,应该把路由单独的拿出来
- 在App.js的同级目录下新建routers文件夹,在此routers创建相关的router
const router = require('koa-router')({
prefix:"/lm" //加上路由前缀
})
const controllers =require('../controllers/index')//能读取controllers下所有文件的绝对路径
// //加载路由模块,koa中没有,若用到要重新下载
// const router=new Router() //new Router实例
router.get('/index/index',controllers.home.index)
//从数据库中获取数据返回给前端
// (ctx,next)=>{
// ctx.body='hello world'
//这个箭头函数是往前端输出东西的,所以弄成一个控制器
module.exports=router //模块导出
6.2 - 封装Controllers控制组件
- Controllers是让后台输出数据到前端上,使前端可以获取到数据,然后由于页面有很多页面,则需要分开写
- 例如创建Home文件夹下面的index.js,连接数据库,抛出要给前端的数据banner
- const {mysql}=require('../../mysql.js')
module.exports=async(ctx)=>{
const banner = await mysql('某个xxx表').where({
//条件
}).select()
//在xxx表中查询是否存在数据
ctx.body={
'banner':banner //往前端抛出banner给前端,使前端能拿到轮播图数据
}
}
- 为了使在路由中不用一个一个文件引入则需封装成一个获取各种文件绝对路径的方法
/获取各种文件绝对路径的方法
const _ =require('lodash')//lodash js中一个库,在原生的js的基础上做了一个封装,实现模块化,高性能的js工具库
const fs=require('fs')
const path=require('path')
// 映射 d 文件夹下的文件为模块
const mapDir = d => {
const tree = {
}
// 获取当前文件夹下的所有文件夹和文件,分成两组,文件夹一组,文件一组
const [dirs, files] = _(fs.readdirSync(d)).partition(p => fs.statSync(path.join(d, p)).isDirectory())
// 映射文件夹
dirs.forEach(dir => {
tree[dir] = mapDir(path.join(d, dir))
});
// 映射文件
files.forEach(file => {
// 获取文件后缀名字
if (path.extname(file) === '.js') {
tree[path.basename(file, '.js')] = require(path.join(d, file))
}
})
return tree
}
// 默认导出当前文件夹下的映射
module.exports = mapDir(path.join(__dirname)) //path.join(__dirname)是绝对路径