前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nodejs+koa.js实现服务端内容(超级详细

Nodejs+koa.js实现服务端内容(超级详细

原创
作者头像
KID.
修改2023-10-09 10:18:17
6461
修改2023-10-09 10:18:17
举报

代码对应地址

node服务端代码

前端vue3+typescript代码地址

最近在使用vue3typesript写一个后台系统的demo。对于一些登录及内容数据不想单纯的使用假数据模拟,所以从零搭建一个nodejs的后端内容

首先进行下一栏安装

代码语言:txt
复制
npm i koa koa-router koa-bodyparser nodemon

项目的目录结构

代码语言:txt
复制
project
│   README.md
│   .env    
│   package.json
└───src
│   └───app  // 服务端代码实现
│    │   │   index.ts  // 引入koa及相关内容,导出 
│    │   │   config.ts  // 导出.env中的环境变量
│    │   │   database.ts  // 连接数据库
│    │   │   
│    └───controller // 对应的业务处理层
│    └───middleware  // 中间件
│    └───router  // 匹配 路由
│    └───service  // SQL相关操作
│    └───type
│     │   main.ts // 服务端启动文件
│   
└───node_modules
    │   ...

前置条件

首先需要在本地安装mysql

mysql安装地址

安装后需要进行mysql初始化 这里会提示你登录密码,需要保存登录密码先登入数据库。登入后再修改密码

代码语言:txt
复制
mysqld --initialize

执行成功后会生成data文件夹,就是初始化的内容。

如果提示报错,mysql命令不可用,可以在安装的mysql文件夹下的bin中吊起终端执行。所有的mysql都要替换成./mysql

代码语言:txt
复制
./mysqld --initialize

启动 MySQL

代码语言:txt
复制
systemctl start mysqld

查看 MySQL 运行状态

代码语言:txt
复制
systemctl status mysqld

需要给mysql设置密码,在项目中连接时需要配置的密码(我忘记我是不是这么配置的了)

代码语言:txt
复制
mysqladmin -u root password "new_password";

执行 输入设置好的密码就可以使用了

代码语言:txt
复制
./mysql -u root -p
Enter password:*******

项目中安装mysql

代码语言:txt
复制
npm i mysql2

在database中使用并连接,下面有对应代码

页面代码

安装了nodemon package.json中可以使用nodemon启动项目

代码语言:txt
复制
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "cross-env NODE_ENV=development nodemon ./src/main.ts"
  },

main.js

代码语言:txt
复制
const app = require('./app')
const config = require('./app/config') // config中读取了.env中配置的环境变量

app.listen(config.port, () => {
  console.log('8001 OK')
})

app/database.ts 连接mysql数据库 可以根据mysql创建本地数据库连接

代码语言:txt
复制
const mysql = require('mysql2')
const config = require('./config')

const connections = mysql.createPool({
  host: config.sql_host,
  user: config.user,
  port: config.sql_port,
  password: config.password,
  database: config.database
})

connections.getConnection((err: any, conn: any) => {
  conn.connect((err: any) => {
    if (err) {
      console.log('sql error')
    } else {
      console.log('sql OK')
    }
  })
})

module.exports = connections.promise()

app/index.ts

代码语言:txt
复制
const koa = require('koa')
//解析请求参数的
const bodyParser = require('koa-bodyparser')
const routers = require('../router/index') //整合所有的页面统一返回路由
const errorHandler = require('./error-handle') //处理错误函数

const app = new koa()

app.on('error', errorHandler)
app.use(bodyParser()) //解析请求参数的
// 调用router.routes()来组装匹配好的路由,返回一个合并好的中间件
Object.keys(routers).map(item => {
  app.use(routers[item].routes())
  app.use(
    routers[item].allowedMethods({
      // throw: true, // 抛出错误,代替设置响应头状态
      // notImplemented: () => '不支持当前请求所需要的功能',
      // methodNotAllowed: () => '不支持的请求方式'
    })
  )
})
// 调用router.allowedMethods()获得一个中间件
// 当发送了不符合的请求时,会返回 `405 Method Not Allowed` 或 `501 Not Implemented`

module.exports = app

router/user.ts

代码语言:txt
复制
const Router = require('koa-router')
//controller中定义了对应接口的处理方法
const { login, create, getUserInfo, userLogout } = require('../controller/user') 
//接口参数验证自定义中间件
const { verifyUser, verifyLogin, verifyToken } = require('../middleware/user') 
const userRouter = new Router({ prefix: '/api' })

userRouter.post('/create', verifyUser, create)
userRouter.post('/login', verifyLogin, login)
userRouter.post('/logout', userLogout)
userRouter.get('/userInfo', verifyToken, getUserInfo)

module.exports = userRouter

controller/user

代码语言:txt
复制
const service = require('../service/user')
var jwt = require('jsonwebtoken')
import { UserRes } from '../type/user'
import { CommonRes } from '../type/common'

class UserController {
  // 登录
  async login(ctx: any) {
    // 获取用户请求参数
    const user = ctx.request.body
    let token = jwt.sign(user, 'shhhhh', {
      expiresIn: 60 * 60 * 24
    })
    const result: CommonRes = {
      code: 200,
      message: '登录成功!',
      token: token
    }
    // 返回数据
    ctx.body = result
  }
  // 登出
  async userLogout(ctx: any) {
    const result: CommonRes = {
      code: 200,
      message: '登出成功'
    }
    // 返回数据
    ctx.body = result
  }
  // 创建账户
  async create(ctx: any) {
    // 获取用户请求参数
    const user = ctx.request.body
    // 查数据库
    const result: CommonRes = await service.create(user) //数据库操作创建账号
    // 返回数据
    ctx.body = result
  }
 
  
}

module.exports = new UserController()

service/user

代码语言:txt
复制
// 只做数据库处理操作
const connection = require('../app/database')
import { UserReq } from '../type/user'
import { CommonRes } from '../type/common'

class UserService {
  async create(user: UserReq) {
    const { username, password } = user
    const statement = `INSERT INTO users (name, password) VALUES (?, ?);`
    const createUsersTable = `CREATE TABLE IF NOT EXISTS users(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20) NOT NULL UNIQUE,
	password VARCHAR(50) NOT NULL,
	createAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	updateAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`
    try {
      const createResq = await connection.query(createUsersTable)
    } catch (error) {
      console.log(error)
    }
    const result = await connection.execute(statement, [username, password])
    const res: CommonRes = {
      code: 200,
      message: '创建成功'
    }
    // 将user 存储到数据库
    return res
  }

  //查询用户是否存在
  async getUserByName(name: string) {
    const statement = `SELECT * FROM users WHERE name = ?;`
    const result = await connection.execute(statement, [name])
    return result
  }
}

module.exports = new UserService()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码对应地址
  • 项目的目录结构
  • 前置条件
  • 页面代码
  • main.js
  • app/database.ts 连接mysql数据库 可以根据mysql创建本地数据库连接
  • app/index.ts
  • router/user.ts
  • controller/user
  • service/user
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档