【nodeJS】搭建web服务器

前言

nodeJS不是前端必学的,但会nodeJS必定是你有优势所在。当下的经济大环境下,越来越多的公司希望花更少的money請更能搬砖的’装修工人’。那么,想要符合社会发展需求的我们,也要迈进nodeJS的大坑。

什么是nodeJS?nodeJS有什么用??

nodeJS是一个基于ChromeV8引擎的JavaScript运行时typescript中文版教程,typescript实战指南。是一个基于ChromeV8引擎的JavaScript运行环境。使用了一个事件驱动、非阻塞式I/O的模型。

nodeJS是一个让JavaScript运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。

我是一个前端程序员,但我不懂得像 PHP、Python 或 Ruby 等动态编程语言,然后我想创建自己的服务,那么 Node.js 是一个非常好的选择~!

nodeJS搭建服务器

1.node 的安装【官网下载】

2. 配置node的环境 【推荐】

3.创建服务器

①在项目文件夹中生成 package.json

npm init -y

②安装nodejsWeb应用框架(Express)

npm install express@4.17.1

③在根目录下新建app.js,建简单的服务器

//app.js
// 引入express模块
const express = require('express')
// 创建服务器实例
const app = express()

// 启动服务器
app.listen(5201, () => {
    console.log('api server running at http://127.0.0.1:5201')
})

此时,你在对应路径下的终端中运行node ./app.js ,即可启动服务器(控制台中输出:api server running at http://127.0.0.1:5201)

④配置跨域
安装跨域中间件

npm install  cors@2.8.5
// 跨域(cors中间件)配置
const cors = require('cors')
app.use(cors())

⑤配置解析表单数据的中间件(只能解析 appcialtion/x-www-form-urlencided 格式的表单数据)

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

⑥配置路由

  • 在根目录下创建文件夹router,用于存放路由模块;
  • 在根目录下创建文件夹router_handle,用于存放路由处理模块;
  • 在根目录下创建文件夹schema,用于处理表单验证模块;

⑦关于密码加密,用到了 bcryptjs

⑧关于token,用到了 jsonwebtokenexpress-jwt
新建config.js全局配置文件

// 全局配置文件
module.exports = {
    // 加密和解密 token的密钥
    jwtSecretKey: 'eiton abaaba&^-^',
    // token的有效期
    expiresIn: '10h',
}

在app.js中引用

// 导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')
const config = require('./config')

// 注册将 JWT 字符串解析还原成 JSON 对象的中间件
// 注意:只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到 req.user 属性上
app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^[\/api\/\/pubilc\/]/] }))

⑨初始化数据库
根目录下新建db文件夹,文件夹中新建index.js

const mysql = require('mysql')
const db = mysql.createPool({
    host: 'localhost',
    port: 3306,
    user:'root',
    password:'123456',
    database:'my_db_01'
})

module.exports = db

⑩接口的实现
接下来以用户登录注册为“栗”:

  • 在router文件夹下创建user.js
const express = require('express')
const router = express.Router()
// 导入路由处理模块
const user_handler = require('../router_handler/user')
// 导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
// 导入验证规则对象
const { reg_login_schema } = require('../schema/user')

// 注册新用户
router.post('/reguser',expressJoi(reg_login_schema),user_handler.regUser)

module.exports = router
  • 在router_handle文件夹下创建user.js
// 导入 加密包
const bcrypt = require('bcryptjs')
// 导入生成token的包
const jwt = require('jsonwebtoken')
const config = require('../config')
// 导入数据库模块进行操作
const db = require('../db/index')
// 注册的处理函数
exports.regUser = (req, res) => {
    const userinfo = req.body
    if (!userinfo.username || !userinfo.password) {
        return res.send({ status: 1, msg: '用户名或密码不合法!' })
    }
    // 定义sql语句,查询用户名是否被占用
    const sqlStr = 'select * from ev_users where username=?'
    db.query(sqlStr, userinfo.username, (err, result) => {
        if (err) {
            return res.send({ status: 1, msg: err.message })
        }
        if (result.length > 0) {
            return res.send({ status: 1, msg: '用户名存在,请更换其他用户名!' })
        } else {
            // // 写入数据库
            // 对密码进行加密
            userinfo.password = bcrypt.hashSync(userinfo.password, 10)
            console.log('加密', userinfo.password)
            const sql = 'insert into ev_users set ?'
            db.query(sql, userinfo, (errs, results) => {
                if (errs) {
                    return res.send({ status: 1, msg: errs.message })
                    
                }
                if (results.affectedRows === 1) {
                    console.log('~~注册成功!!', results)
                     return res.send({ status: 0, msg: '注册成功!' })
                } else {
          			return res.send({ status: 1, msg: '注册失败!' })
                }
            })

        }
    })

}

  • 在schema文件夹下创建user.js
const joi = require('@hapi/joi')
/*
================ API方法介绍 ================
    
    .string():数据必须为字符串类型
    .number():数据必须为数字类型
    .integer():数据必须为整数类型
    .alphanum():数据只能包含[a-zA-Z0-9]的字符
    .max(number|string):number:最大长度 | string:最大日期
    .min(number|string):number:最小长度 | string:最小日期
    .required():数据为必填项,不能为null或undefined
    .pattern(正则表达式):以正则表达式的形式验证数据
    .regex(正则表达式):定义字段必须匹配正则规则。
    .email():验证邮箱
    .joi.ref(key:string):引言同辈的键值,就是拿到value
    .not(values:any[]):当前属性的值不能同参数值相同
    .valid(...values:any[]):当前属性的值必须于参数值相同
    .dataUri():当前字段为可以是URL地址
    .allow(...values:any[]):该字段允许为指定参数的值
    .default(any[]):设置该字段的默认值,值可以为string、number、boolean……等

*/

const username = joi.string().alphanum().min(1).max(16).required() //用户名
const password = joi.string().pattern(/^[\S]{6,12}$/).required() //用户密码

const id = joi.number().integer().min(1).required() //用户标识码
const nickname = joi.string().required() //昵称
const email = joi.string().email().required() //邮箱
const url = joi.string().dataUri().required() //用户头像地址


// 登录/注册验证
exports.reg_login_schema = {
    body: {
        username,
        password,
    }
}
  • 在app.js中导入路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)

4.测试api

启动我们的服务器 node ./app.js
打开Apipost APIPOST接口调试工具
在这里插入图片描述

web服务器的搭建(代码):

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值