使用nodeJs框架koa2搭建项目后端
使用koa2搭建项目后端
github源码地址:https://github.com/liuerhost/koa2-demo.git
1. 安装koa脚手架—koa-generator
1 | npm install -g koa-generator |
2. 创建koa2项目
1 | koa2 -e node-demo |
-e 代表使用ejs模板创建工程
node-demo 工程名称
3. 进入工程,安装依赖
1 2 | cd node-demo npm i |
4. 启动项目 ,访问浏览器
1 2 | npm start http: //localhost:3000 |
至此一个简单的Koa工程完成。浏览器输入网址后出现如下
5. 目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | . +-- bin | +-- www // 项目启动必备文件,配置端口等服务信息 +-- db | +-- config.js // 数据库配置信息 | +-- seqMysqlDB.js // sequelize 链接数据库的配置(myslq配置方式一) | +-- mysqlDB.js // mysql基本配置(mysql配置方式二) +-- models | +-- User.js // User实例 +-- node_modules // 项目依赖,安装的所有模块都会在这个文件夹下 +-- public // 存放静态文件,如样式、图片等 | +-- images // 图片 | +-- javascript // js文件 | +-- stylesheets // 样式文件 +-- routers // 存放路由文件,如果前后端分离的话只用来书写api接口使用 | +-- index.js | +-- userBase.js // 使用mysql方式二的路由的方式 | +-- userUpgrade.js // 使用mysql方式一的路由的方式 +-- views // 存放存放模板文件,就是前端页面,如果后台只是提供api的话,这个就是备用 | +-- error.ejs | +-- index.ejs +-- app.js // 主入口文件 +-- package .json // 存储项目名、描述、作者、依赖等等信息 +-- package -lock.json // 存储项目依赖的版本信息,确保项目内的每个人安装的版本一致 |
6. 安装mysql数据库驱动
1 | npm install mysql2 sequelize --save |
7. 安装koa2-cors 跨域包
1 | npm install koa-cors --save |
8. db包:
config.js
1 2 3 4 5 6 7 8 9 | const config = { host: '127.0.0.1' , username: 'root' , password: '123456' , database: 'test1' , port: 3306 } module.exports = config |
mysqlDB.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | const mysql = require( 'mysql' ) // 创建数据池 // const pool = mysql.createPool({ // host: '127.0.0.1', // user: 'root', // password: '123456', // database: 'jxgl' // }) // // 在数据池中进行会话操作 // pool.getConnection(function(err,connection){ // connection.query('select * from t_jxgl_user',(error,results,fields)=>{ // // 结束会话 // connection.release(); // // 如果有错误就抛出 // if (error) throw error; // }) // }) function _connection(){ let connection = mysql.createConnection({ host: '127.0.0.1' , user: 'root' , password: '123456' , database: 'jxgl' }) connection.connect(); return connection; } exports.query = function (sql,params = null ){ let connection = _connection(); return new Promise( function (resolve,reject){ connection.query(sql,params, function (error,results,fields){ if (error) throw error; resolve(results); }); connection.end(); }) } |
seqMysqlDB.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | const Sequelize = require( 'sequelize' ); const config = require( './config' ) console.log( 'init sequelize...' ); const sequelize = new Sequelize(config.database,config.username,config.password,{ host: config.host, // 数据库地址 dialect: 'mysql' , // 指定数据库类型 pool:{ max:5, // 最大连接数量 min:0, // 最小连接数量 idle:10000 // 如果一个线程10s内没有被使用过的话就释放 }, logging: true // 显示log }) //对连接进行测试,查看控制台 // sequelize // .authenticate() // .then(() => { // console.log('******Connection has been established successfully.********'); // console.log('******测试结束,即将退出!!!********'); // process.exit(); //结束进程 // }) // .catch(err => { // console.error('***************Unable to connect to the database:***********', err); // }); module.exports = sequelize; |
9. models包
User.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | const Sequelize = require( "sequelize" ); const sequelize = require( '../db/seqMysqlDB' ); const User = sequelize.define( 'users' , { username: { type: Sequelize.STRING(100), unique: true }, password: Sequelize.STRING(100), }, { freezeTableName: false , timestamps: true }); //timestamp字段,默认为true,表示数据库中是否会自动更新createdAt和updatedAt字段,false表示不会增加这个字段。 //freezeTableName,默认为true,会自动给表名表示为复数: user => users,为false则表示,使用我设置的表名 //创建表,默认是false,true则是删除原有表,再创建 User.sync({ force: false , }); module.exports = User; |
/routes/userDemo.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | const model = require( "./model" ); const Router = require( "koa-router" ); let router = new Router(); router.prefix( '/userDemo' ) let User = model.User; //获取User模型 router.get( '/' , async (ctx) => { ctx.body = '欢迎来到用户首页!' }); //注册页 router.get( '/registerPage' , async (ctx) => { let html = ` <div> <h1>Hello,Koa2! request POST</h1> <h2>注册页!!!</h2> <form method= "POST" action= "/userDemo/register" > <p>username:</p> <input name= "username" /> <br/> <p>password:</p> <input name= "password" /> <br/> <button type= "submit" >submit</button> </form> </div> `; ctx.body = html; }); //注册 router.post( '/register' , async (ctx) => { let registerUser = ctx.request.body; console.log(User) await User.create({ username: registerUser.username, password: registerUser.password }) .then((result) => { ctx.body = { code: 200, msg: '注册成功!' , message: result } }) . catch (err => { ctx.body = { code: 500, msg: '注册失败!' , message: err } }) }); //登录页 router.get( '/loginPage' , async (ctx) => { let html = ` <div> <h1>Hello,Koa2! request POST</h1> <h2>页!!!</h2> <form method= "POST" action= "/userDemo/login" > <p>username:</p> <input name= "username" /> <br/> <p>password:</p> <input name= "password" /> <br/> <button type= "submit" >submit</button> </form> </div> `; ctx.body = html; }); //登录 router.post( '/login' , async (ctx) => { let loginUser = ctx.request.body; //数据库查询 await User.findOne({ where: { username: loginUser.username, } }) //查询值传入 .then(async (result) => { //判断密码是否一致 if (result && (result.password === loginUser.password)) { ctx.body = { code: 200, message: '登录成功' , }; } else { ctx.body = { code: 500, message: '用户名不存在' , }; } }) . catch (err => { //findOne行为发生错误时 ctx.body = { code: 500, message: '登录出错!' , data: err }; }) }); //查找所有 router.get( '/allUser' , async (ctx) => { try { let result = await User.findAll(); if (result) { ctx.body = { code: 200, message: result } } else { ctx.body = { code: 500, message: '表中没有数据!' , }; } } catch (error) { ctx.body = { code: 500, message: '错误' , data: err }; } }) module.exports = router; |
app.js修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | const Koa = require( 'koa' ) const app = new Koa() const views = require( 'koa-views' ) const json = require( 'koa-json' ) const onerror = require( 'koa-onerror' ) const bodyparser = require( 'koa-bodyparser' ) const logger = require( 'koa-logger' ) const cors = require( 'koa2-cors' ) const Router = require( 'koa-router' ) const index = require( './routes/index' ) const users = require( './routes/users-old' ) const user = require( "./routes/userDemo.js" ); // error handler onerror(app) // middlewares app.use(bodyparser({ enableTypes:[ 'json' , 'form' , 'text' ] })) app.use(json()) app.use(logger()) app.use(require( 'koa-static' )(__dirname + '/public' )) app.use(views(__dirname + '/views' , { extension: 'ejs' })) // logger app.use(async (ctx, next) => { const start = new Date() await next() const ms = new Date() - start console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) }) // routes app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods()) app.use(user.routes(),user.allowedMethods()) // 新增 // error-handling app.on( 'error' , (err, ctx) => { console.error( 'server error' , err, ctx) }); // 设置跨域 app.use(cors()); module.exports = app |
到此整个配置完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?