[TOC]

nodejs介绍

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时
通俗nodejs可以实现类似于java php python能够提供的后台服务 属于javascript(前端)
可以编写后台接口
以后如果报错显示找不到包 就执行npm i

npm cnpm yarn

npm 是一个包管理工具(它的服务器在国外) 使用npm下载包的速度有点慢
cnpm 是一个淘宝镜像 同步npm包管理工具里边所有的包
淘宝团队为了方便国内的用户下载npm里边的包 构建了一个国内服务器
用来同步npm管理工具里边所有的包 下载速度非常快
yarn 也是一个包管理工具
运行环境 npm cnpm yarn在执行的时候需要一个运行环境
下载nodejs 英文:https://nodejs.org/en/
中文:https://nodejs.org/zh-cn/
进入官网点击长期维护版本进行下载
是否安装成功: 打开cmd命令行 在里边输入node -v 出现对应的nodejs版本 表示安装成功
安装之后 npm就可以直接使用了
npm -v 查看你的npm版本
注意:
如果你的电脑是win7则建议你安装12版本
如果你的电脑是win10则可以安装推荐的稳定版本
npm常用命令:
初始化 npm init
安装需要的npm包 npm install 包名 —save 安装到生产环境中
npm install 包名 —save-dev 安装到开发环境中
npm install 包名 -global 安装到全局
npm i 包名 —save-dev
npm可以一次性安装多个package包
npm i 包名1 包名2 … —save-dev
移除安装的包 npm uninstall 包名
cnpm uninstall 包名
cnpm淘宝镜像:
使用npm安装淘宝镜像
npm install -g cnpm —registry=https://registry.npmmirror.com
npm能够去安装的执行的命令 cnpm都可以执行
yarn包管理工具
安装 使用 cnpm 或者 npm 来进行安装
命令:
cnpm i yarn -g
npm i yarn -g
安装之后判断是否安装成功 在命令行中输入 yarn —version
如果显示对应版本 表示安装成功
项目初始化 yarn init
包安装 yarn add 包名 —dev // 安装到开发环境
包移除 yarn remove 包名
安装项目的全部依赖 yarn 或者 yarn install

原生node.js接口请求 [不用]

前提 你的电脑必须安装nodejs
是基于nodejs的web框架 可以编写基于nodejs接口
除了express之外我们还有egg.js Koa.js基于nodejs的框架
【实际不用node.js编写 我们用express框架】
1.使用原生node.js请求 1 创建一个项目文件 mkdir 项目名
2 初始化项目 npm init
2.创建一个example.js文件 输入这个 const http=require(‘http’);

const hostname=’127.0.0.1’;
const port=3000;
const server= http.createServer((req, res) => {
res.statusCode=200;
res.setHeader(‘Content-Type’, ‘text/plain’);
res.end(<br /> {<br /> name: '1111',<br /> age: 15<br />});
});
server.listen(port, hostname, ( ) => {
console.log(服务器运行在 http://${hostname}:${port}/);
});
3.命令行执行 node example.js
4.生成地址可以直接打开 服务器运行在 http://127.0.0.1:3000/

应用生成器工具express-generator [不用]

快速创建一个应用的骨架 【一般不用 除非公司让用】
优点:接口可以分开写,页面更加干净整洁
1.安装首先创建文件及并进入+初始化 1 创建一个项目文件 mkdir 项目名
2 初始化项目 npm init
3 安装npm install -save-dev express-generator
老版本用npm install -g express-generator
4 运行一下 express
5 运行index.js node index.js
2.接口都在routes里面 index.js只写首页的接口
users.js只写用户的接口
3.routes里面新建一个order.js
复制粘贴users.js
app.js里面新建
var orderRouter = require(‘./routes/order’)
app.use(‘/order’,orderRouter);
4.执行一下 npm run start

express框架

fetch请求接口
express框架 【写接口用的】
express
前提 你的电脑必须安装nodejs
是基于nodejs的web框架 可以编写基于nodejs接口
除了express之外我们还有egg.js Koa.js基于nodejs的框架
1.使用express首先创建文件及并进入+初始化 1 创建一个项目文件 mkdir 项目名
2 初始化项目 npm init
3 安装express npm install express —save-dev
4 创建index.js 编写接口文件
5 运行index.js node index.js
2.因为package.json中 “main”: “index.js”
中入口文件是index.js
所以创建index.js入口文件
//index.js中粘贴
const express = require(‘express’)
const app = express( )
const port = 3000

//你的第一个接口 get请求
app.get(‘/login’, (req, res) => {
res.send({
status:200,
data: [
{
id:1,
title:”测试”
}
]
})
})
app.listen(port, () => {
console.log(Example app listening at http://localhost:${port})
})


//最后 底部
app.listen(port, () => {
console.log(Example app listening at http://localhost:${port})
})
3.运行接口 node index.js
在页面中插入自己的数据库 MySQL
Express参考文档http://expressjs.com/en/guide/database-integration.html#mysql
1.安装 安装 cnpm i mysql —save-dev
npm install body-parser —save-dev
2.在index.js顶部引入一下 const mysql = require(‘mysql’)
3.在index.js顶部下面粘贴一下
创建数据库链接
//创建数据库链接
const connection = mysql.createConnection({
host:’localhost’,
user:’root’,
password:’root’,
database:’yuedu’
})
4.连接数据库 粘贴到
//创建数据库链接 代码的下方
//连接数据库
connection.connect( )

connection.query(‘select * from t_articles’, function (err, rows, fields) {
console.log(rows)
})

index.js 的内容

//5.直接把数据输出到页面里面   index.js里面写的

//index.js中粘贴
const express = require('express')
const mysql = require('mysql')
const bodyParser = require('body-parser')
const app = express()
const port = 3000
const jsonParser = bodyParser.json()
const urlencodedParser = bodyParser.urlencoded({ extended: false })
app.use(urlencodedParser)
app.use(jsonParser)

//创建数据库链接
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'yuedu'
})
//连接数据库
connection.connect()

// 打印全部数据
// connection.query('select * from t_articles;', function (err, rows, fields) {
//     console.log(rows)
// })

// 文章列表接口
app.get('/articles', async (req, res) => {
    console.log(1111, req.query.id)
    const id = req.query.id
    const mount = req.query.limit
    const page = req.query.page
    let total;
    try {
        await connection.query(`select * from t_articles where type_id=${id};`, function (err, rows, fields) {
            total = rows.length
        });
        await connection.query(`select * from t_articles where type_id=${id} limit ${(page - 1) * mount},${mount};`, function (err, rows, fields) {
            res.send({
                status: 200,
                data: {
                    data: rows,
                    total: total
                }
            })
        });
    } catch {
        console.log('输出错误')
    }
})

//注册接口
app.post('/register', (req, res) => {
    console.log(req.body.name, req.body.psw)
    const username = req.body.name
    const psw = req.body.psw
    connection.query(`insert into t_users (username,password) values ('${username}','${psw}');`, function (err, rows, fields) {
        res.send({
            status: 200
        })
    })
})

//登录接口
app.get('/login', (req, res) => {
    console.log(req.body.name, req.body.psw)
    const username = req.query.name
    const password = req.query.psw
    console.log(username, password)
    connection.query(`select * from t_users where username="${username}" and password="${password}";`, function (err, rows, fields) {
        console.log(rows)
        if (rows.length > 0) {
            res.send({
                status: 1    //如果匹配成功 返回给前台1
            })
        } else {
            res.send({
                status: 2    //如果匹配不成功 返回给前台2
            })
        }
    })
})

//修改用户名接口
app.put('/changeUser', (req, res) => {
    connection.query('updata t_users set username="surperman" where id=7', function (err, rows, fields) {
        res.send({
            status: 200
        })
    })
})

//修改文章标题接口
app.put('/changeArticle', (req, res) => {
    const title = req.body.title
    const author = req.body.author
    connection.query(`update t_articles set title="${title}",author="${author}" where id=5;`, function (err, rows, fields) {
        res.send({
            status: 200
        })
    })
})

//删除文章接口
app.delete('/delArticle', (req, res) => {
    connection.query('delete from t_articles where id=1', function (err, rows, fields) {
        res.send({
            status: 200
        })
    })
})

// 文章分类接口
app.get('/sorts', (req, res) => {
    connection.query('select * from t_types', function (err, rows, fields) {
        res.send({
            status: 200,
            data: rows
        })
    })
})


//文章详情页面
app.get('/detail', (req, res) => {
    const id = req.query.id
    connection.query(`select * from t_articles where id=${id}`, function (err, rows, fields) {
        res.send({
            status: 200,
            data: rows
        })
    })
})


app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
})

index.html 的内容

//在html页面中打印出来

<ul>
    <li></li>
</ul>

<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script>
    var ul = document.querySelector("#ul");
    var tabId = 1;
    var page1 = document.querySelector("#page1");
    var ul1 = document.querySelector("#ul1");
    var str2 = "";
    var ul = document.querySelector("ul");
    var str = '';


---------------------------------------------------------------------------------------- 
//分页按钮
function pageMount(mount) {
    str2 = "";
    for (var i = 1; i <= mount; i++) {
        str2 += `
             <li onclick="getPage(${i})"> ${i} </li>
            `
    }
    page1.innerHTML = str2;
}
---------------------------------------------------------------------------------------- 
//分页数据请求
function getPage(page) {
  tab(tabId, page);
}
----------------------------------------------------------------------------------------
// 请求分类 标题tab切换   点击标题切换列表
axios.get("http://localhost:3000/sorts").then(res => {
    console.log(res.data.data)
    str = ''
    res.data.data.forEach(item => {
        str += `
            <li onclick="tab(${item.id})">${item.type}</li>
        `
    })
    ul.innerHTML = str
}).catch(err => {
    console.log(err)
})
----------------------------------------------------------------------------------------
//文章列表
    fetch("http://localhost:3000/articles").then(res => {
        return res.json()
    }).then(res1 => {
        console.log(res1.data);
        res1.data.forEach(item => {
            str += `
            <li>${item.title}</li>
            `
        });
        ul.innerHTML = str
    }).catch(err => {
        console.log(err);
    })
----------------------------------------------------------------------------------------
// 注册
btn.onclick = () => {
    fetch("http://localhost:3000/register", {
        method: "POST"
    }).then(res => res.json()).then(res1 => {
        console.log(res1);
    }).catch(err => {
        console.log(err);
    })
}
----------------------------------------------------------------------------------------
//登录
btn.onclick = function () {
    const admin = document.querySelector("#admin").value
    const psw = document.querySelector("#psw").value
    axios.get("http://localhost:3000/login", {
        params: {
            name: admin,
            psw
        }
    }).then(res => {
        console.log(res);
        if (res.data.status == 1) {
            alert("登录成功")
            window.location.href = "index.html"
        } else {
            alert("登录失败")
        }
    }).catch(err => {
        console.log(err);
    })
}
---------------------------------------------------------------------------------------- 
// 修改
btn.onclick = () => {
    fetch("http://localhost:3000/changeUser", {
        method: "PUT"
    }).then(res => res.json()).then(res1 => {
        console.log(res1);
    }).catch(err => {
        console.log(err);
    })
}
---------------------------------------------------------------------------------------- 
//注册列表
var btn = document.querySelector("button");
btn.onclick = function () {
    const admin = document.querySelector("#admin").value
    const psw = document.querySelector("#psw").value
    axios.post("http://localhost:3000/register", {
        name: admin,
        psw
    }).then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    })
}
---------------------------------------------------------------------------------------- 
// 文章列表
var str = '';
fetch("http://localhost:3000/articles").then(res => {
    return res.json()
}).then(res1 => {
    console.log(res1.data);
    res1.data.forEach(item => {
        str += `
    <li>${item.title}</li>
    `
    });
    ul.innerHTML = str
}).catch(err => {
    console.log(err);
})    
---------------------------------------------------------------------------------------- 
// 修改文章标题
btn.onclick = function () {
    const tit = document.querySelector("#title").value
    const author = document.querySelector("#author").value
    axios.put("http://localhost:3000/changeArticle", {
        title: tit,
        author: author
    }).then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    })
}
</script>

---------------------------------------------------------------------------------------- 
//请求文章
var ul1 = document.querySelector("#ul1");
function tab(id = 1,page = 1) {
    str1 = ''
    tabId=id
    axios.get("http://localhost:3000/articles", {
        params: {
            id,
            limit:15,
            page:page
        }
    }).then(res => {
        console.log(res.data.data)
        res.data.data.forEach(item => {
            str1 += `
            <li>${item.title} 
                <p onclick="del(${item.id})">删除</p>
            </li>
          `
        })
        ul1.innerHTML = str1
    }).catch(err => {
        console.log(err);
    })
}
tab()
---------------------------------------------------------------------------------------- 
//删除文章
function del(id) {
    console.log(id)
    axios.delete("http://localhost:3000/delArticle?id=" + id).then(res => {
        console.log(res)
        tab()
    }).catch(err => {
        console.log(err)
    })
}
----------------------------------------------------------------------------------------
// 请求文章 标题 index.html
function tab(id = 1, page = 1) {
    str1 = '';
    tabId = id
    axios.get("http://localhost:3000/articles", {
        params: {
            id,
            limit: 10,
            page: page
        }
    }).then(res => {
        console.log(res.data.data.data, res.data.data.total / 10)
        pageMount(Math.ceil(res.data.data.total / 10))
        res.data.data.data.forEach(item => {
            str1 += `
            <li>
                <a href="detail.html?id=${item.id}">
                    ${item.title}
                </a>
            </li>
            `
        })
        ul1.innerHTML = str1
    }).catch(err => {
        console.log(err);
    })
}
tab()

//跳转到详情页 detail.html
<script>
    <div class="detail">
        <div class="content"></div>
    </div>
    var detail = document.querySelector(".detail");
    var str = '';
    axios.get("http://localhost:3000/detail", {
        params: {
            id: location.search.split("=")[1]
        }
    }).then(res => {
        var tit = res.data.data[0].title;
        var content = res.data.data[0].content;
        console.log(111, res.data.data[0].title)
        str += `
             <h2>${tit}</h2>
             <div>${content}</div>
        `
        detail.innerHTML = str
    }).catch(err => {
        console.log(err)
    })
</script>




</script>

mysql解除外键关联

强制关闭相关的数据库关键字关系:
SET FOREIGN_KEY_CHECKS = 0;

传值

get形式传值 axios.get(“url”, {
params: {
参数名:参数值
}
})

express需要使用 req.query.参数
post形式传值
(加入购物车需要)
你需要使用 req.body.参数名来进行参数获取
在使用req.body之前
你需要使用npm安装body-parser中间件
有了这个中间件我们就可以调用body
安装
npm i body-parser —save-dev
在接口文件中需要引入并且调用body-parser
const bodyParser=require(‘body-parser’)
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
后边就可以直接使用req.body.参数名获取post接口传递的参数
put形式传值 需要使用 req.body.参数名 来进行参数获取
delete形式取值 需要使用 req.query.参数名 来进行参数获取

nodemon自动更新工具 node index.js

nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用程序。
1.安装
如果在命令行执行nodemon 启动的js文件
如果报错nodemon不是内部或者外部命令时候 说明nodemon这个命令不能被全局识别
所以这个时候你可以使用npm进行全局安装nodemon
npm i -g nodemon 全局安装
npm i —save-dev nodemon 局部安装
2.package.json中添加 “scripts”: {
“test”: “echo \“Error: no test specified\“ && exit 1”,
“start”: “nodemon index.js”
},
3.npm start 启动监听脚本 npm run start
4.运行 nodemon 要被启动的js文件
这个时候你的js文件就会被持续进行监听

跨域问题

在进行后台数据请求 这个时候就有可能产生跨域 产生跨域的原因
1 不同端口
2 不同域名
3 不同协议
解决跨域 1 前端解决
1 使用jsonp
2 在vue中使用proxy代理
3 使用nginx反向代理
4 如果接口使用nodejs来进行编写 这个时候前端可以使用header头
//设置跨域访问 放在index.js文件里面
app.all(‘‘, function(req, res, next) {
res.header(“Access-Control-Allow-Origin”, “
“);
res.header(“Access-Control-Allow-Methods”, “GET,HEAD,OPTIONS,POST,PUT”);
res.header(“Access-Control-Allow-Headers”, “Origin, X-Requested-With, Content-Type, Accept, Authorization”);
next();
});
5 浏览器安装插件
2 后台解决
后台添加header头文件
以php语言为例
header(“Access-Control-Allow-Origin: *”);
header(‘Content-Type: text/html;charset=utf-8’);
header(‘Access-Control-Allow-Methods:POST,GET,OPTIONS’);

vue中使用本地数据库

1.安装express npm install express —save-dev
2创建index.js 编写接口文件
3运行index.js node index.js
4.安装mysql npm i mysql —save-dev
5安装mysql npm install body-parser —save-dev
6.运行 node index.js