Nodejs后端接口项目

225 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 1 天,点击查看活动详情

README相关

建议

  • 下载nodemon以便接口改变之后热更新。

npm i nodemon -g

使用

  • 下载相关依赖

npm install

  • 运行

如果下载了nodemon


nodemon app.js

如果没下载


node app.js

测试方法

  • posterman

一定记得,当你访问非api开头的接口时,发送请求一定要携带Authorization,否则你将没有权限处理。

项目分析

项目结构

  • app.js
  • config.js
  • package-lock.json
  • package.json
  • router_handler
    • user.js
    • userinfo.js
    • artcate.js
  • router
    • user.js
    • userinfo.js
    • artcate.js
  • schema
    • user.js
    • artcate.js
  • db
    • index.js

项目重点

1. 组件模块化

app.js是入口文件,config.js是全局配置文件,router_handler是方法文件,router是导航文件,schema是用来存导入验证规则的包的相关配置文件。

2. 前置配置

  • cors()跨域

const cors = require('cors')

app.use(cors())

  • 封装res.send()发送错误消息,在前面封装一个中间件,这样能够简化代码。

app.use((req, res, next) => {
    // 默认 status 为 1 , 也就是有错误
    res.cc = function(err, status = 1) {
        res.send({
            status,
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})
  • 封装数据库

const mysql = require('mysql')

const db = mysql.createPool({

    host: '127.0.0.1',

    user: 'root',

    password: 'admin123',

    database: 'my_db_01'

})
  • bcryptjs用来给密码加密的

// 导入 bcryptjs

const bcrypt = require('bcryptjs')

// 加密

userInfo.password = bcrypt.hashSync(userInfo.password)

// 判断密码是否合法

const compareResult = bcrypt.compareSync(userInfo.password, result[0].password)

  • 生成token的包

const jWT = reqire('jsonwebtoken')

const tokenStr = jWT.sign(user, config.jwtSecretKey, {expiresIn: config.expires})

// 前面一般要加上 Bearer

res.send({
    status: 0,
    message: '登录成功',
    token: 'Bearer ' + tokenStr
})

  • @escook/express-joijoi

用来做表单验证的


/* scheme */

// 导入定义规则的包
const Joi = require('joi')
const username = Joi.string().alphanum().min(1).max(10).required()
const password = Joi.string()
                .pattern(/^[\S]{6,12}$/)
                .required()

// define a rule

exports.reg_login_schema = {
// 都在body里存着
    body: {
        username: username,
        password: password,
    }
}


/* router */
const express = require('express');
const router = express.Router()
const user_handler = require('../router_handler/user')


// 1. 导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
// 2. 导入需要的验证规则对象
const { reg_login_schema } = require('../schema/user')
// 可以复用这个校验规则
router.post('/login', expressJoi(reg_login_schema), user_handler.login)

module.exports = router
+ + + + + + + + // 是如下使用的
router.post('/login', expressJoi(reg_login_schema), user_handler.login)

3. 数据库相关语法

数据库的创建

const mysql = require('mysql')
const db = mysql.createPool({
    host: '127.0.0.1',
    user: 'root',
    password: 'admin123',
    database: 'my_db_01'
})

这里的用户是root,密码是admin123,数据库是my_db_01,端口用在了127.0.0.1

SQL相关操作

增删改查

insert into users (username, password) values ('tony stark', '098123');

这个是正常的写法,只是当数据量极大的时候,括号里面的东西很难填完,所以我们需要有简化的写法。

insert into 数据表 set ?
-- Example
const sqlStr2 = "insert into ev_users set ?"
db.query(sqlStr2,{username: userInfo.username, password: userInfo.password}, () => {})

问号表示这里放要插入的东西,set是简化写法

delete from 数据表 where 标记地点
delete from users where id=4 -- Example
update 表名称 set 列名称 = 新值 where 列名称 = 某值

下面是简化写法&实际用法

const sql = `update ev_users set ? where id=?`
db.query(sql, [req.body, req.body.id], () => {})
select * from users where id=2
const sql = `select * from ev_article_cate where name=? or alias=?`

*代表选择所有满足条件的

一些其他

  • where用来限定我要增删改查啥。
  • andor用来在where中进行细节的处理和分析。
  • order by xxx用来排序

其中有ascdesc分别表示正序排列和逆序排列。

主要业务逻辑梳理

可以看到,项目中主要分为了三个部分:

  1. user
  2. userinfo
  3. artcate 其中,user是用来注册和登录的;userinfo是用来更改用户信息的,artcate是用来获取和更新文章及其分类的相关信息的。

项目源码