1.先安装 基本需要的东西
ps: Express 06 制作留言板项目 创建第一个项目_Sengoku_Xingzi的博客-CSDN博客
根据上面这篇文章完成最基本的搭建 本篇就不重复了
可以用apifox 来测试接口
npm install express
主体
npm install multer
上传的中间件
npm install sqlite3
链接数据库
npm install uuid
不可能重复的id 几百年才可能重复一个 用作token
算法的 id
会根据时间戳 等等 之类的算法 生成id 效率比较好 不会重复
使用方法:创一个文件放ta
基本操作:
app.js 完整代码
写好了 测试路由text 和 登录路由admin 和 分类增删改查路由 category
const express = require("express"); //引入
const multer = require("multer"); //引入
const app = express(); //实例化注册
const path = require("path");//固定格式
const port = 3030; // 自定义地址
const { db,genid } = require("./db/DbUtils"); //引入雪花id和数据库
//开放跨域请求,跨域请求放在在中间件的上面
app.use(function (req,res,next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin","*");
//允许的header类型
res.header("Access-Control-Allow-Headers","*");
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS");
if (req.method == "OPTIONS") res.sendStatus(200); //让options尝试请求快速结束
else next();
});
app.use(express.json()); //中间件
// 引用就要使用啦 multer
const update = multer({
//上传的文件地址
dest: "./public/upload/temp",});
app.use(update.any()); //允许所有上传
// 指定静态资源路径
app.use(express.static(path.join(__dirname,"public")));
// 路由中间件 基础
//app.use(定义的接口名字,require(中间件文件路径))
app.use("/test",require("./routers/TestRouter"));
app.use("/admin",require("./routers/AdminRouter"));
app.use("/category",require("./routers/CategoryRouter"));
// 路由中间件 测试
app.get("/",(req,res) => {
res.send("hello world");
});
// 启动项 node app.js 后会出现的 里面有变量所以用波浪
app.listen(port,() => {
console.log(`启动成功: http://localhost:${port}/`);
});
数据库: DbUtils.js
数据库 创建方法 看置顶链接
const sqlite3 = require("sqlite3").verbose(); //引入sqlite3
const { resolve } = require("path");
const path = require("path"); //获取地址,引入数据库
// const { param } = require("../routers/TestRouter")
const Genid = require("../utils/SnowFlake"); //引入雪花id
// db是暴露出去,给用户作为工具使用的
var db = new sqlite3.Database(path.join(__dirname,"blog.sqlite3"));
//地址转换成字符串
//WorkerId是一个机器码,这样服务器的id就不会重复
const genid = new Genid({ WorkerId: 1 }); //现在只有一个所以id先设置为1
db.async = {}; //定义一个异步的
// 进行sql,和parms还有回调函数的一个封装
db.async.all = (sql,params) => {
return new Promise((resolve,reject) => {
db.all(sql,params,(err,rows) => {
resolve({ err,rows });
// resolve()异步回调将promise变为fulfilled(已成功)状态
// reject()异步回调将promise变为rejected(已失败)状态
// 异步的写法,防止回调地狱
// Promise的构造函数接收回调函数作为参数
});
});
};
// 新增和修改在run里面执行
db.async.run = (sql,reject) => {
db.run(sql,rows });
});
});
};
module.exports = { db,genid }; //把数据库和雪花id先导出去,就不会别的页面总是要引入了
写接口前 想好最基础有什么数据 要先创建数据库 再去写接口
routers 下的 TestRouter
const express = require("express"); //1.引入express
const router = express.Router(); //2.引入路由
const { db,genid } = require("../db/DbUtils"); //引入雪花id和数据库
// 测试接口
router.get("/test",async (req,res) => {
// //async允许异步执行
// db.all("select * from `admin`",[],rows) => {
// // promist封装成一个函数,再执行,不然会嵌套很多个数据语句
// console.log(rows);
// });
// // then方法, 是接收之前promise异步的方法
// db.async.all("select * from `admin`",[]).then((res) => {
// console.log(res);
// });
let out = await db.async.all("select * from `admin`",[]);
res.send({
id: genid.NextId(),out,//out:out返回数据等于err,rows
});
});
module.exports = router; //3.导出路由
routers 下的 AdminRouter
创建了token 返回信息就给一个token uuid
const express = require("express"); //1.引入express
const router = express.Router(); //2.引入路由
const { db,genid } = require("../db/DbUtils"); //引入雪花id和数据库
const { v4: uuidv4 } = require("uuid"); //引入雪花id和数据库
// 登錄接口
router.post("/login",res) => {
let { account,password } = req.body;
let { err,rows } = await db.async.all(
"select * from `admin` where `account` = ? And `password` = ? ",[account,password]
);
if (err == null && rows.length > 0) {
let login_token = uuidv4();
let update_token_sql = "UPDATE `admin` SET `token` = ? where `id` = ?";
await db.async.run(update_token_sql,[(login_token,rows[0].id)]);
let admin_info = rows[0];
admin_info.token = login_token;
admin_info.password = "";
res.send({
code: 200,msg: "登录成功",data: admin_info,});
} else {
res.send({
code: 500,msg: "登录失败",});
}
});
module.exports = router;
小tip查询用all 插入修改用run 没有东西返回就用run
routers下的 CategoryRouter.js 文件
写好了 四个基本接口 看下面代码
const express = require("express"); //1.引入express
const router = express.Router(); //2.引入路由
const { db,genid } = require("../db/DbUtils"); //引入雪花id和数据库
const { v4: uuidv4 } = require("uuid"); //引入雪花id和数据库
// 目前这个是没有 谁都可以增删改查 所以需要一个登录状态的校验 这个后面做
//列表接口 分頁和分類就不做了
//添加接口
//修改接口
//刪除接口
//列表接口 分頁和分類就不做了
router.get("/list",res) => {
const search_sql = "SELECT * FROM `category`";
// 這個id,name 跟的是 上面這行數據庫查詢語句的 的順序
let { err,rows } = await db.async.all(search_sql,[]);
if (err == null) {
res.send({
code: 200,msg: "查詢成功",rows,msg: "查詢失败",});
}
});
// 删除接口 /category/_token/delete?id=xxx
router.delete("/delete",res) => {
let id = req.query.id;
const delete_sql = "DELETE FROM `category` WHERE `id` = ?";
let { err,rows } = await db.async.run(delete_sql,[id]);
if (err == null) {
res.send({
code: 200,msg: "删除成功",msg: "删除失败",});
}
});
// 修改接口
router.put("/update",res) => {
let { id,name } = req.body;
const insert_sql = "INSERT INTO `category` (`id`,`name`) VALUES (?,?)";
// 這個id,rows } = await db.async.run(insert_sql,[id,name]);
if (err == null) {
res.send({
code: 200,msg: "修改成功",// rows,msg: "修改失败",});
}
});
// 添加接口
router.post("/add",res) => {
let { name } = req.body;
const insert_sql = "INSERT INTO `category` (`id`,?)";
let { err,[genid.NextId(),name]);
if (err == null) {
res.send({
code: 200,msg: "添加成功",msg: "添加失败",});
}
});
module.exports = router;
原文地址:https://blog.csdn.net/Sengoku_Xingzi
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。