1.async+express+mysql :
// 引入express
const express = require('express');
// 引入cors
const cors = require('cors');
// 引入select_mysql.js
let proMysql = require('./common/async_mysql');
const e = require('express');
/*
虽然通过require();引入了自定义的js文件,
但是js文件里面的代码,并没有被require找到;
需要被引入的文件将方法/变量名通过
module.exports 暴漏在外,才能够找到;
*/
// 创建express实例
const app = express();
// 处理跨域
app.use(cors());
// 写一个get请求的register
app.get('/register',async ({query},res,next)=>{
// 定义一个sql的查询语句
let sql = `select * from userinfo where userName="${query.userName}"`;
let data = await proMysql(sql);
if(data.code == 1){
if(data.data.length == 0){
let inertSql = `insert into userinfo (userName,userPassword) values ("${query.userName}","${query.userPassword})`
let insertData =await proMysql(inertSql);
if(insertData.code == 1){
res.end(JSON.stringify(insertData.data))
}else{
res.end(insertData.data)
}
}else{
res.end('用户已注册');
}
}else{
res.end(result.data)
}
})
// 启动服务
app.listen(8080,'127.0.0.1',()=>{
console.log('http://127.0.0.1:8080/');
})
2.post+express+body-parser :
// 引入express
const express = require('express');
// 引入cors
const cors = require('cors');
// 引入body-parser
/*
解析post的请求体里面的参数;
*/
const bodyParser = require('body-parser');
// 创建app实例
const app = express();
// 引入cors解决跨域中间件
app.use(cors());
// 解析application/json参数
app.use(bodyParser.json());
// 解析 text/plain
app.use(bodyParser.text());
app.use(express.static('common'))
// post入口
app.post('/register',(req,res)=>{
console.log(req.body);
res.end(JSON.stringify({}))
})
// 启动服务
app.listen(8080,'127.0.0.1',()=> {
console.log('地址是: http://127.0.0.1:8080/');
})
3.静态托管:
// 引入express
const express = require('express');
// 创建app实例
const app = express();
// 使用express的static 把文件托管到服务器上
// 也就是可以通过地址/路径的方式访问到
/*
托管文件
app.use(入口,express.static(相对路径))
相对路径有一点问题;
如果用vscode的run code插件运行那么,
托管的路径从项目的根目录开始写
如果用命令行cmd运行,就可以使用
正常的相对路径
如果代码放在服务器上,路径填写正常的相对路径
入口的路径,替代express.static的路径
*/
// app.use('/common',express.static('/nodeJs/2.node+express+mysql/common'))
app.use('/public',express.static('./common'))
// 启动服务器
app.listen(8080,'127.0.0.1',()=>{
console.log('http://127.0.0.1:8080/');
})
4.文件上传前需要配置的模块:
4.1npm初始化:
4.2安装express模块 :
4.3安装cors模块:
4.4安装mysql:
4.5安装body-parser模块:
HTML+前端部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./download/font_3801592_bo0a4xwi2bc/iconfont.css">
<style>
*{
margin: 0;
padding: 0;
}
body{
width: calc(100vw - 34px);
padding: 0 17px;
height: 100vh;
overflow: hidden;
background-image: url(./back.webp);
background-size: 100% 100%;
}
.title{
width: 100%;
height: 44px;
line-height: 44px;
display: flex;
justify-content: space-between;
color: #fff;
}
.left_icon .iconfont{
font-size: 30px;
}
.center_title{
font-size: 20px;
}
.right_icon .iconfont{
font-size: 35px;
}
.head{
padding: 35px 0;
display: flex;
justify-content: center;
}
.headImg{
width: 100px;
height: 100px;
border-radius: 50%;
border: 1px solid #fff;
background-color: rgba(0, 0, 0, 0.1);
}
.upload{
width: 60px;
height: 60px;
padding: 20px;
text-align: center;
color: #fff;
}
.icon{
height: 35px;
line-height: 35px;
}
.icon-jiahao{
font-size: 40px;
}
.head_title{
height: 25px;
line-height: 25px;
font-size: 18px;
}
.upload_img{
width: 100%;
height: 100%;
border-radius: 50%;
overflow: hidden;
display: none;
}
.upload_img img{
width: 100%;
height: 100%;
border-radius: 50%;
}
.form{
width: 70%;
padding: 20px 15%;
}
.input{
height: 50px;
}
.input input {
width: 100%;
height: 35px;
line-height: 35px;
font-size: 19px;
outline: 0;
border: 0;
background-color: rgba(0, 0, 0, 0);
border-bottom: 2px solid #eee;
}
.input input:focus{
border-bottom: 2px solid pink;
}
/* 改变input的placeholder的颜色 */
.input input::-webkit-input-placeholder {
color: #fff;
}
.btn{
width: 70%;
padding: 20px 15%;
text-align: center;
}
.button button{
width: 100%;
height: 40px;
line-height: 40px;
border-radius: 22px;
font-size: 20px;
color: rgb(61, 6, 61);
font-weight: bold;
outline: 0;
border: 0;
box-shadow: 5px 0 5px #eee;
background-color: #fff;
}
.button button:active{
background-color: #eee;
}
.desc{
height: 50px;
line-height: 50px;
font-size: 14px;
color: #fff;
}
.desc span{
color: aqua;
}
</style>
</head>
<body>
<div class="app">
<div class="title">
<div class="left_icon">
<span class="iconfont icon-fanhui"></span>
</div>
<div class="center_title">
注册
</div>
<div class="right_icon">
<span class="iconfont icon-gantanhaozhong"></span>
</div>
</div>
<div class="head">
<div class="headImg">
<div class="upload">
<div class="icon">
<span class="iconfont icon-jiahao"></span>
</div>
<div class="head_title">
头像
</div>
</div>
<div class="upload_img">
<img>
</div>
</div>
</div>
<div class="form">
<div class="input">
<input type="text" class="userName" placeholder="用户名">
</div>
<div class="input">
<input type="password" class="password" placeholder="设置密码">
</div>
<div class="input">
<input type="password" class="repassword" placeholder="确认密码">
</div>
</div>
<div class="btn">
<div class="button">
<button>注册</button>
</div>
<div class="desc">
已经有帐号了?<span>登录</span>
</div>
</div>
</div>
<script>
//给headImg添加点击事件
document.addEventListener('click', function (e){
})
// 给headImg添加点击事件
document.querySelector('.headImg').onclick = function (e){
// 动态创建input
let input = document.createElement('input');
// 改变type
input.type = 'file';
// js触发点击
input.click();
// 监听input改变
input.onchange = function (){
// 获取input选择的file文件信息
let select_file = input.files[0];
// 创建ajax
let ajax = new XMLHttpRequest();
// 打开连接
ajax.open('post','http://192.168.2.119:8080/upload',false);
// 创建FormData
let data = new FormData();
// 将选择的文件写入formdata
/*
FormData是一个虚拟的表单;
表单提交会刷新整个页面;
在项目的部署的时候不会出现这个问题
*/
data.append('file',select_file);
// 发送
ajax.send(data);
// 监听
ajax.onreadystatechange = function ({currentTarget}){
// 最后一次握手
if(currentTarget.readyState == 4 && currentTarget.status == 200){
// 先赋值图片路径
document.querySelector('.upload_img img').src = currentTarget.response;
// 让上传图片的消失
document.querySelector('.upload').style.display = 'none';
// 让图片的显示
document.querySelector('.upload_img').style.display = 'block';
}
}
}
}
</script>
</body>
</html>
ndoejs后端配置:
api.js文件:
const express = require('express');
const cors = require('cors');
const multer = require('multer');
const path = require('path');
const bodyParser = require('body-parser');
const proMysql = require('./async_mysql')
let app = express();
app.use(cors())
app.use(bodyParser.json());
app.use(bodyParser.text());
app.use(bodyParser.urlencoded({extended:false}));
app.use('/public',express.static('/作业/11.29作业/public'))
let storage = multer.diskStorage({
destination: path.join(__dirname,'./public'),
filename: function (req,file,cb){
// 获取到上传文件的类型
let type = file.originalname.split('.')[1];
// 获取到文件的名字
let fliedName = file.originalname.split('.')[0];
// cb文件保存信息
// null 都是空 第二个参数 保存文件的名字
cb(null,`${fliedName}-${Date.now()}.${type}`)
}
})
let upload = multer({storage});
app.post('/upload',upload.single('file'),(req,res)=>{
res.end(`http://127.0.0.1:8080/public/${req.file.filename}`)
})
app.post('/register',async ({body},res,next)=>{
// 转换成json格式
body = JSON.parse(body);
// 定义一个sql的查询语句
let sql = `select * from user where userName="${body.userName}"`;
let data = await proMysql(sql);
if(data.code == 1){
if(data.data.length == 0){
let inertSql = `insert into user (userName,userPassword,nickName,sex,headImg,createTime) values ("${body.userName}","${body.userPassword}","易潇潇","男","${body.headImg}","${Date.now()}")`
let insertData =await proMysql(inertSql);
if(insertData.code == 1){
res.end(JSON.stringify(insertData.data))
}else{
res.end(insertData.data)
}
}else{
res.end('用户已注册');
}
}else{
res.end(result.data)
}
})
app.listen(8080,'192.168.2.119',()=>{
console.log('http://192.168.2.119:8080/');
})
async_mysql.js:
// 封装一个sql语句的处理函数
async function proMysql(sql){
// 创建一个promise
let pro =await new Promise((resolve,reject)=>{
// 引入mysql模块
let mysql = require('mysql');
// 创建数据库连接
let con = mysql.createConnection({
// 地址
host:'localhost',
// 数据库名称
database: 'web2208',
// 数据库用户名
user:'wdx',
// 数据库密码
password: 'a1641670284'
});
// 打开数据库连接
con.connect();
// 执行sql语句
con.query(sql,(error,result)=>{
if(error){
resolve({
// 返回一个对象的原因,是直接在then函数判断执行是否正确 0错误
code: 0,
data: error
})
}else{
resolve({
code: 1,
data: result
})
}
con.end();
})
})
// 返回
return pro
}
// select_mysql.js的方法需要暴漏在在外,通过module.exports = 要暴漏的方法/变量
// 才能够被require引用到;
module.exports = proMysql;