Node.js Express搭建項目個人使用記錄

一、新建項目文件夾 myapp 作為項目的文件夾

二、新建index.js作為項目的初始文件

(一)、在index.js文件同級新建一個package.json文件作為項目的配置文件,其中需要配置的基礎文件如下:



{

??"name":?"myapp",

??"version":?"1.0.0",

??"description":?"",

??"main":?"index.js",

??"scripts":?{

????"test":?"echo?\"Error:?no?test?specified\"?&&?exit?1",

????"nodemon":?"nodemon?./index.js"

??},

??"author":?"",

??"license":?"ISC",

??"dependencies":?{

????"body-parser":?"^1.19.0",

????"connect-multiparty":?"^2.2.0",

????"core-js":?"^3.2.1",

????"cors":?"^2.8.5",

????"express":?"^4.17.1",

????"jsonwebtoken":?"^8.5.1",

????"jwt-simple":?"^0.5.6",

????"moment":?"^2.24.0",

????"mysql":?"^2.17.1",

????"nodemon":?"^1.19.2",

????"register-service-worker":?"^1.6.2"

??}

(二)、index.js文件內主要做引入用,做為文件的入口文件,如下:

const?express?=?require('express')

const?app?=?express()

const?path=require('path')

const?fs=require('fs')

const?cors?=?require('cors')

app.use(cors())

//注冊中間件,拿到res.body的內容????

const?bodyParser=require("body-parser")

app.use(bodyParser.urlencoded({extended:false}))

app.use(bodyParser.json())

//?引入路由

//?使用循環的方式readdir?查詢目錄?進行路由的注冊

fs.readdir(path.join(__dirname,"./router"),(err,filenames)=>{

????if(err)?return?console.log("讀取路由失敗");

????//?console.log(filenames);

????//循環每一個文件名?循環一次拼接出一個完整的路由模塊?然后使用require導入這個路由模塊

????filenames.forEach(fname=>{

????????const?router=require(path.join(__dirname,'./router',fname))

????????app.use(router)

????})

})

app.listen(3000,?()?=>?console.log('http://localhost:3000'))

//這里的app.listen(300,()=>conslole.log(' http://localhost:3000 '))是暴露鏈接地址? 在前端直接引入

前端是用的Vue-cli3.0搭建的項目? ?在API / server.js里面寫接口的? ?引入如下:

import?axios?from?'axios'; axios.defaults.baseURL="http://192.168.2.52:3000" axios.defaults.headers.post['Content-Type']?=?'application/x-www-form-urlencoded';


(三)、新建router文件分發路由:(在上文index.js中已經介紹了引入router文件導出接口的方法)

const?express=require('express')

const?router=express.Router()

const?ctrl=require("../controller/stu")

//?拿到所有的數據

router.get('/getallclass',ctrl.getallclass)

router.post('/getcom',ctrl.getcom)

router.get('/getmeclsaa',ctrl.getmeclsaa)

router.post('/getmodify',ctrl.getmodify)

router.get('/getagemax',ctrl.getagemax)

router.get('/getclass',ctrl.getclass)

router.get('/getmodstu',ctrl.getmodstu)

module.exports=router

(四)、新建自己的頁面寫接口和SQL語句? ?我這里寫的是stu? ?從上面可以看出來? 在router中已經引入了stu.js這個文件? ?而在stu.js里面? 則需要我們鏈接到數據庫并且在頁面的最下面暴露這個頁面寫的接口方便router來獲取到這個接口

//?引入數據庫

const?conn=require("../db/sql")

//?寫sql語句拿到數據

const?getallclass=(req,res)=>{

????const?headMaster=req.query.headMaster

????const?monitor=req.query.monitor

????const?subordinateClass=req.query.subordinateClass

????var?currentPage=req.query.pageNum;

????var?size=req.query.pageSize;

????//?var?sql8='select?*?FROM?class?where?1=1?'

????var?sql8=`SELECT?m.*,

????(SELECT?count(id)?FROM?(SELECT

com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

cls.floor,cls.headMaster,cls.monitor,cls.number

FROM

competition?com

LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?t)?AS?total

FROM?(SELECT

com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

cls.floor,cls.headMaster,cls.monitor,cls.number

FROM

competition?com

LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?m?where?1=1?`?

????if(headMaster!=''){

?????????sql8=`SELECT?m.*,

?????????(SELECT?count(id)?FROM?(SELECT

?????com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

?????cls.floor,cls.headMaster,cls.monitor,cls.number

?????FROM

?????competition?com

?????LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?t?where?headMaster='${headMaster}')?AS?total

?????FROM?(SELECT

?????com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

?????cls.floor,cls.headMaster,cls.monitor,cls.number

?????FROM

?????competition?com

?????LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?m?where?1=1?and?headMaster='${headMaster}'`

????}

????if(monitor!=''){

????????sql8=`SELECT?m.*,

????????(SELECT?count(id)?FROM?(SELECT

????com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

????cls.floor,cls.headMaster,cls.monitor,cls.number

????FROM

????competition?com

????LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?t?where?monitor='${monitor}')?AS?total

????FROM?(SELECT

????com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

????cls.floor,cls.headMaster,cls.monitor,cls.number

????FROM

????competition?com

????LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?m?where?1=1?and?monitor='${monitor}'`

????}

????if(subordinateClass!=''){

????????sql8=`SELECT?m.*,

????????(SELECT?count(id)?FROM?(SELECT

????com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

????cls.floor,cls.headMaster,cls.monitor,cls.number

????FROM

????competition?com

????LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?t?where?subordinateClass=${subordinateClass})?AS?total

????FROM?(SELECT

????com.id,com.competition_type?competitionType,com.competition_user?competitionUser,com.ranking,com.subordinate_class?subordinateClass,

????cls.floor,cls.headMaster,cls.monitor,cls.number

????FROM

????competition?com

????LEFT?JOIN?class?cls?ON?com.subordinate_class?=?cls.className)?m?where?1=1?and?subordinateClass=${subordinateClass}?`

????}

????sql8+=`limit?${(currentPage-1)*size},${size}`


????conn.query(sql8,(err,result)=>{

????????if(err)?return?res.send({starus:400,message:"查詢失敗"})

????????res.send({status:200,message:'請求成功',data:result})

????})

}

//新增學生參加比賽信息

const?getcom=(req,res)=>{

????const?body=req.body

????var?sql81=`insert?into?competition(competition_type,competition_user,ranking,subordinate_class)?values(${body.competition_type},'${body.competition_user}',${body.ranking},${body.subordinate_class})`


????conn.query(sql81,(err,result)=>{

????????if(err)?return?res.send({starus:401,message:'新增失敗'})

????????res.send({status:200,message:'新增成功',data:result})

????})

}

//選擇班級后獲取到對應的班級信息

const?getmeclsaa=(req,res)=>{

????const?subordinateClass=req.query.subordinateClass

????var?sql12=`SELECT?*?FROM?class?WHERE?className=${subordinateClass}`

????conn.query(sql12,(err,result)=>{

????????if(err)?return?res.send({starus:400,message:"查詢失敗"})

????????res.send({status:200,message:'請求成功',data:result})

????})

}

//修改比賽信息

const?getmodify=(req,res)=>{

????const?body=req.body

????var?sql82=`UPDATE?competition?SET?competition_user='${body.competition_user}',?ranking=${body.ranking},competition_type=${body.competition_type},subordinate_class=${body.subordinate_class}?WHERE?id=${body.id}`

????console.log(sql82);


????conn.query(sql82,(err,result)=>{

????????if(err)?return?res.send({starus:401,message:'修改失敗'})

????????res.send({status:200,message:'修改成功',data:result})

????})

}

//查詢年齡在十八歲以上的

const?getagemax=(req,res)=>{

????var?age=req.query.age;

????const?sql1=`SELECT?*?from?stuclass?WHERE?age>${age}`

????conn.query(sql1,(err,result)=>{

????????if(age=='')?return?res.send({starus:200,message:'null'})

????????if(err)?return?res.send({starus:401,message:'查詢失敗'})

????????res.send({status:200,message:'請求成功',data:result})

????})

}

//查詢學生所在班級

const?getclass=(req,res)=>{

????const?sql2=`SELECT?*?from??(SELECT?s.*,c.name?as?className?FROM?stuclass?s?LEFT?JOIN?class?c?ON?s.cid?=?c.id)?t?WHERE?t.className='一(1)'`

????conn.query(sql2,(err,result)=>{

????????if(err)?return?res.send({starus:403,message:'查詢失敗'})

????????res.send({code:200,message:'請求成功',data:result})

????})

}

//修改學生年齡

const?getmodstu=(req,res)=>{

????const?num=req.query.num

????const?ageChang=req.query.ageChang

????const?sql3=`UPDATE?stuclass??SET?age?=?${ageChang}?WHERE?age?<?${num}`

????conn.query(sql3,(err,result)=>{

????????if(err)?return?res.send({starus:403,message:'查詢失敗'})

????????res.send({code:200,message:'請求成功',data:result})

????})

}

module.exports={

????getallclass,

????getcom,

????getmodify,

????getmeclsaa,

????getagemax,

????getclass,

????getmodstu

}

(五)、最后我們來看一下引入數據庫是如何操作的

const?mysql=require("mysql");

const?conn=mysql.createConnection({

????host:"localhost",? ? //這里是鏈接數據庫? ?我的是本地啟動的? 所以是localhost

????user:"root",? ? ? ? ? ? ?//輸入mysql用戶名

????password:"root",????? ?//輸入mysql密碼

????database:"new_text"? ? ?//這里是輸入的庫名

})

module.exports=conn

三、以上就是node.js express框架寫接口的大概流程? ?源碼都貼出來了,應該很好理解

我這里是自己寫的前后端項目? ? 試著寫的node.js? ? ?肯定還有不到位的地方

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容