一齐蔽、新建項(xiàng)目文件夾 myapp 作為項(xiàng)目的文件夾
二、新建index.js作為項(xiàng)目的初始文件
(一)昼汗、在index.js文件同級(jí)新建一個(gè)package.json文件作為項(xiàng)目的配置文件肴熏,其中需要配置的基礎(chǔ)文件如下:
{
??"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文件內(nèi)主要做引入用顷窒,做為文件的入口文件,如下:
const?express?=?require('express')
const?app?=?express()
const?path=require('path')
const?fs=require('fs')
const?cors?=?require('cors')
app.use(cors())
//注冊(cè)中間件,拿到res.body的內(nèi)容????
const?bodyParser=require("body-parser")
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
//?引入路由
//?使用循環(huán)的方式readdir?查詢目錄?進(jìn)行路由的注冊(cè)
fs.readdir(path.join(__dirname,"./router"),(err,filenames)=>{
????if(err)?return?console.log("讀取路由失敗");
????//?console.log(filenames);
????//循環(huán)每一個(gè)文件名?循環(huán)一次拼接出一個(gè)完整的路由模塊?然后使用require導(dǎo)入這個(gè)路由模塊
????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搭建的項(xiàng)目? ?在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文件分發(fā)路由:(在上文index.js中已經(jīng)介紹了引入router文件導(dǎo)出接口的方法)
const?express=require('express')
const?router=express.Router()
const?ctrl=require("../controller/stu")
//?拿到所有的數(shù)據(jù)
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
(四)、新建自己的頁(yè)面寫接口和SQL語(yǔ)句? ?我這里寫的是stu? ?從上面可以看出來? 在router中已經(jīng)引入了stu.js這個(gè)文件? ?而在stu.js里面? 則需要我們鏈接到數(shù)據(jù)庫(kù)并且在頁(yè)面的最下面暴露這個(gè)頁(yè)面寫的接口方便router來獲取到這個(gè)接口
//?引入數(shù)據(jù)庫(kù)
const?conn=require("../db/sql")
//?寫sql語(yǔ)句拿到數(shù)據(jù)
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:'請(qǐng)求成功',data:result})
????})
}
//新增學(xué)生參加比賽信息
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})
????})
}
//選擇班級(jí)后獲取到對(duì)應(yīng)的班級(jí)信息
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:'請(qǐng)求成功',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:'請(qǐng)求成功',data:result})
????})
}
//查詢學(xué)生所在班級(jí)
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:'請(qǐng)求成功',data:result})
????})
}
//修改學(xué)生年齡
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:'請(qǐng)求成功',data:result})
????})
}
module.exports={
????getallclass,
????getcom,
????getmodify,
????getmeclsaa,
????getagemax,
????getclass,
????getmodstu
}
(五)谓着、最后我們來看一下引入數(shù)據(jù)庫(kù)是如何操作的
const?mysql=require("mysql");
const?conn=mysql.createConnection({
????host:"localhost",? ? //這里是鏈接數(shù)據(jù)庫(kù)? ?我的是本地啟動(dòng)的? 所以是localhost
????user:"root",? ? ? ? ? ? ?//輸入mysql用戶名
????password:"root",????? ?//輸入mysql密碼
????database:"new_text"? ? ?//這里是輸入的庫(kù)名
})
module.exports=conn
三泼诱、以上就是node.js express框架寫接口的大概流程? ?源碼都貼出來了,應(yīng)該很好理解
我這里是自己寫的前后端項(xiàng)目? ? 試著寫的node.js? ? ?肯定還有不到位的地方