1. 程式人生 > 實用技巧 >新建表,nodejs寫一些介面的例子

新建表,nodejs寫一些介面的例子

表關聯:

每種資料儘量都用一個表去儲存。將文章表與使用者表關聯時,可以將作者欄位可以改成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)

關於密碼加密

cryptonode.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的語法差不多。