新建表,nodejs寫一些介面的例子
阿新 • • 發佈:2020-07-18
表關聯:
每種資料儘量都用一個表去儲存。將文章表與使用者表關聯時,可以將作者欄位可以改成author: {type:Schema.Types.ObjectId, ref: 'User'}
即可關聯起來,ref後邊表示需要關聯的表的名字
例:在集合表中的作者欄位,用來存使用者id,可以用
.populate('author',{password:0})表示出來使用者名稱,不管使用者名稱如何更改id是不會更改的,所以根據id找使用者名稱就不會發生找不到的現象。
// 新建表(集合) let Schema = mongoose.Schema; // 新建文章表 let ArticleSchema= new Schema( { title: String, //文章標題 title 是字串型別 body: String, //文章內容 // 作者欄位 存 使用者id, 作者欄位ref-參考 使用者表 author: {type:Schema.Types.ObjectId,ref:"User"}, // aaa: {type:Schema.Types.ObjectId,ref:"zzz"}, comments: [{ body: String, date: Date }], //評論 hidden: { type: Boolean,// 文章是否能被普通使用者看見 default: false, }, favs: { type: Number, //預設 點贊次數0 default: 0, }, }, { timestamps: true, //增加兩個欄位 記錄 建立時間 修改時間 } ); // 根據表名 和 表結構 得到資料庫模型 let Article = mongoose.model("Article", ArticleSchema); // 使用者表結構 let UserSchema = new Schema({ username:{type:String,required:true}, password:{type:String,required:true}, age:{type:Number}, headImgUrl:{type:String}//使用者頭像地址 }) // 資料庫模型 // 插入使用者 let User = mongoose.model('User',UserSchema)
關於密碼加密
crypto是node.js的一個核心模組,可以用它生成三列值來加密密碼
MD5,是一種常用的雜湊演算法,用於給任意資料一個“簽名”,這個簽名通常用一個十六進位制的字串表示。
用法:
let crypto = require("crypto");
//獲取 md5 演算法 var md5 = crypto.createHash("md5"); //將11111加密,並轉換為 hex 16進位制 輸出 var password = md5.update("11111").digest("hex"); console.log(password);
下面是介面的相關程式碼
註冊介面:
/* 介面總地址 http://localhost:3000 註冊介面 /users/register 請求型別 post 引數 必選 username 使用者名稱字 password 使用者密碼 可選 age 介面返回json資料 {code:1,msg:"註冊成功"} {code:0,msg:"註冊失敗"} */ // 引入表模型 let {User} = require('../models'); const checkToken = require('../middleware/checkToken'); router.post('/register',async function(req,res){ // post 請求的引數獲取 console.log(req.body) //undefined urlecode內建中間 解析請求體 // { username: 'wangwu', password: '123456' } // 插入資料庫 let {username,password} = req.body; // 將密碼 使用md5 加密 let md5 = crypto.createHash('md5'); password = md5.update(password).digest('hex'); console.log(password) try { let u = new User({username,password}); let data = await u.save() console.log(data) res.json({code:1,msg:"註冊成功"}) } catch (error) { console.log(error) res.json({code:0,msg:"註冊失敗-使用者名稱和密碼必須要填寫"}) } })
登入介面相關程式碼,
/* 登入介面 /users/login 請求型別 get 引數 必選 username 使用者名稱字 password 使用者密碼 可選 age 介面返回json資料 {code:1,msg:"註冊成功"} {code:0,msg:"註冊失敗"} */ router.get('/login',async function(request,response){ // request 前端發起的請求 // response 後端的響應 // get 請求的引數 req.query 獲取url中?後面的引數,自動轉為了物件 // { username: 'zhangsan', password: '123456' } let adminName = 'admin'; let adminPwd = '12345'; console.log(request.query) // 前端傳遞過來的引數 let username = request.query.username; let password = request.query.password; // 將使用者的 密碼 進行加密,去資料庫中 對比 let md5 = crypto.createHash('md5') password = md5.update(password).digest('hex') console.log(username,password) // 查詢使用者名稱和密碼是否在 資料庫中 let u = await User.findOne({username,password}) console.log(u) if(u){ //登入成功,生成toekn,下發token console.log('登入成,生成toekn,下發token') let token = jwt.sign({id:u._id,username},'zz2003',{expiresIn:"30d"}); console.log(token) response.json({code:1,msg:"登入成功",data:{token,id:u._id}}) }else{ console.log('登入失敗') response.json({code:0,msg:"登入失敗"}) } })
更新頭像介面
/* 介面總地址 http://localhost:3000 更新頭像 /users/headimg 需要登入 (請求頭 token) 請求型別 put 引數 必選 可選 headImgUrl 使用者頭像 介面返回json資料 {code:1,msg:"註冊成功"} {code:0,msg:"註冊失敗"} */ router.put('/headimg',checkToken, async function(req,res){ let token = req.headers.authorization // 獲取token解密以後的物件 let tokenObj = jwt.verify(token,'zz2003') console.log(tokenObj) let userid = tokenObj.id; // 獲取前端提交的資料 let {headImgUrl} = req.body; let data = await User.updateOne({_id:userid},{headImgUrl}) console.log(data) if(data){ } res.json({code:1,msg:"更新成功"}) })
獲取文章列表介面
/* 獲取使用者id下的文章列表介面 /article/:id 請求型別 get 引數 必選 :id 使用者id ,如果傳了使用者id ,就獲取這個使用者的文章列表,如不傳使用者id,就獲取所有人的文章列表 可選 pagenum pagesize 介面返回json資料 {code:1,msg:"成功獲取到使用者的文章"} {code:0,msg:"沒有獲取到使用者的文章"} */ router.get("/:id", async function (req, res) { // 獲取使用者id let author = req.params.id; // 獲取頁碼和 每頁個數,預設 頁碼0,每個數10 let {pagesize=10,pagenum=0} = req.query; let data = await Article.find({author}) .sort({_id:-1}) //降序排列 .skip(pagesize*pagenum) //頁數 .limit(pagesize) //每頁開始的個數 .populate('author',{password:0})//根據id得到使用者名稱,不會隨著使用者名稱變化之後,找不使用者 .exec() res.json({ msg: "獲取到個人文章",data }); }); /* 獲取 所有 文章列表介面 /article 請求型別 get 引數 必選 可選 pagenum pagesize 介面返回json資料 {code:1,msg:"成功獲取到使用者的文章"} {code:0,msg:"沒有獲取到使用者的文章"} */ router.get("/", async function (req, res) { // 獲取頁碼和 每頁個數,預設 頁碼0,每個數10 let {pagesize=10,pagenum=0} = req.query; pagenum--; let data = await Article.find() .sort({_id:-1}) .skip(pagesize*pagenum) .limit(parseInt(pagesize)) .populate('author',{password:0}) .exec() res.json({ msg: "獲取到所有文章",data }); });
釋出文章介面
/* 釋出文章介面 /article ps:需要登入 ,在請求頭設定token 請求型別 post 引數 必選 title body 可選 age 介面返回json資料 {code:1,msg:"成功釋出"} {code:0,msg:"釋出失敗"} */ let {Article} = require('../models') router.post("/", checkToken, async function (req, res) { // token已經驗證通過,把文章資料插入到資料庫 // { id: 1, username: 'admin', iat: 1594775916, exp: 1597367916 } try { // 獲取請求中的token ,token有使用者id let token = req.headers.authorization // 獲取token解密以後的物件 let tokenObj = jwt.verify(token,'zz2003') console.log(tokenObj) let author = tokenObj.id; // 獲取前端提交的資料 let {title,body} = req.body; // 插入資料庫 let a = new Article({ title,body,author }) let data = await a.save() res.json({ code: 1, msg: "已經登入,釋出文章成功",data}); } catch (error) { console.log(error); res.json({ code: 0, msg: "已經登入,釋出文章失敗" }); } });
刪除文章介面
/* 刪除文章介面 /article/:id ps:需要登入 ,在請求頭設定token 請求型別 delete 引數 必選 :id 介面返回json資料 {code:1,msg:"刪除成功"} {code:0,msg:"刪除失敗"} */ router.delete("/:id", checkToken, async function (req, res) { //req.params 獲取到了 /article/1 { id: '1' } console.log(req.params); // 要出文章的id let artilceID = req.params.id; // 獲取使用者id(只有文章的作者才可以刪除文章) let token = req.headers.authorization // 獲取token解密以後的物件 let tokenObj = jwt.verify(token,'zz2003') console.log(tokenObj) let author = tokenObj.id; // 將資料庫中對應的文章刪除了, let data = await Article.deleteOne({author,_id:artilceID}) console.log(data) // { n: 0, ok: 1, deletedCount: 0 } // { n: 1, ok: 1, deletedCount: 1 } if(data.deletedCount ===1){ res.json({ msg: "刪除成功" }); }else{ res.json({ msg: "刪除失敗-許可權不夠或者文章不存在" }); } });
使用node.js寫介面語言和js的語法差不多。