使用nodejs写接口连接数据库

如何在服务器端写接口?

创建服务器

1.1导入express包;

const express=require(‘express’);

1.2 创建服务器实例:

const app=express();

要注意的是:

在路由之前

** 创建解决跨域问题的中间件:

const cors=require(‘cors’)

app.use(core())

** 创建处理表单数据的中间件:

app.use (express.json())

app.use(express.urlencoded({extended:false}))

配置解析token的中间件

const expressJWT=require(‘express-jwt’);

const config= require(./config) //配置

//解析中间件,声明哪些不需要保护

app.use(expressJWT ({
     

  secret: config.jwtSecretKey  //配置的秘钥 

}).unless({
     

  path: [/^\/api\//]  // /api下的内容不需要验证token

}))
1.3 创建路由

导入路由,模块化,将不同的路由功能挂载在不同的路由对象上

//导入并使用 用户 注册登录路由模块
app.use('/api', require('./router/user'))
//用户信息路由
app.use('/my', require('./router/userinfo'))
//导入并使用文章分类的路由模块
app.use('/my/article',require('./router/article'))

然后在路由模块再导入具体的处理函数;(用户注册登录模块为例)

const express = require('express')
const router = express.Router()
//导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')
// 导入需要的验证的规则对象
const {
     
    reg_login_shema
} = require('../schema/user')
//注册新用户路由
// expressJoi(reg_login_shema)进行校验
router.post('/reguser', expressJoi(reg_login_shema), require('../router_handler/user/user'))
//登录  expressJoi(reg_login_shema) 校验
router.post('/login', expressJoi(reg_login_shema), require('../router_handler/user/login'))
//暴露出去
module.exports = router
1.4启动服务器

app.listen(3007)在3007端口启动

注意点1,

在登录模块登陆成功后需要设置一个token字符串用于确认用户信息

设置方式:

1,下载并导入jsonwebtoken这个包 用常量jwt接收;

2,在确认用户可以登陆之后,将用户的信息(隐藏隐私信息如密码与头像)通过jwt.sign方法生成token字符串

jst.sign(参数1,参数2,参数3) 参数1为token要包含的用户信息,参数2,为用户设置的秘钥(随便设置) 参数3位对象格式的{expiresIn:‘时效’}设置该token字符串的有效期

解析token:

app.use(expressJWT ({
     

  secret: config.jwtSecretKey //自动将载体部分赋值给req.body,

}).unless({
     

  path: [/^\/api\//]//定义不需要验证的路径

}))

注意点2

表单数据在提交之前需要先通过一个中间件的验证

1,安装并导入包const joi=require(" @hapi/joi")

2,定义要验证的对象

3,将验证规则对象导出

//定义用户名和密码的验证规则
const username = joi.string().alphanum().min(1).max(10).required();
const password = joi.string().pattern(/^[\S]{6,12}$/).required();

//定义id nickname email的验证规则
const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()

//定义 验证头像avatar的 规则
const avatar = joi.string().dataUri().required();


//注册表单内容的验证规则对象
exports.reg_login_shema = {
     
    body: {
     
        username,
        password,
    },
}

//用户基本信息的验证规则对象
exports.update_userinfo_schema = {
     
    body: {
     
        id,
        nickname,
        email,
    },
}
//更改密码验证规则对象
exports.update_password_schema = {
     
    body: {
     
        oldPwd: password,
        newPwd: joi.not(joi.ref('oldPwd')).concat(password)
    },
}
//
exports.update_avatar_schema = {
     
    body: {
     
        avatar,
    },
}

注意点3

**需要对用户密码进行加密,**这样,加入数据库被盗取,也不回使用户密码丢失而产生损失;

1,安装并导入包const bcryptjs = require(‘bcryptjs’)

2, 调用hashSync方法进行加密:

 //调用bcryptjs.hashSync()对明文密码进行加密
        password = bcryptjs.hashSync(password, 10)

3,参数1为要加密的对象,参数2为定义加密密码计算强度

4,这个方法对相同字符多次加密的结果并不相同,无法解密

5,更改密码时需要比较原密码是否相同;

此时用到另一个方法:

bcryptjs.compareSync(oldPwd, results[0].password)

results为在数据库查找到的数据结果,上面方法返回值为布尔类型,

注意点4

在路由之后加一个捕获错误的中间件:
这样出现错误之后,该中间件会捕获错误返货发送,从而防止整个系统的崩溃,其他功能还可以正常使用

app.use((err, req, res, next) => {
     
    //表单验证错误
    if (err instanceof Joi.ValidationError) return res.cc(err)
    //认证错误,token错误
    if (err.name === 'UnauthorizedError') return res.cc('身份认证失败!')
    //未知错误
    res.cc(err)
})

你可能感兴趣的:(实战,node.js,js接口)