Node.js Express搭建項(xiàng)目個(gè)人使用記錄

一齐蔽、新建項(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? ? ?肯定還有不到位的地方

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赊锚,一起剝皮案震驚了整個(gè)濱河市治筒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舷蒲,老刑警劉巖耸袜,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異牲平,居然都是意外死亡堤框,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門纵柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈抓,“玉大人,你說我怎么就攤上這事昂儒」凳梗” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荆忍,是天一觀的道長(zhǎng)格带。 經(jīng)常有香客問我,道長(zhǎng)刹枉,這世上最難降的妖魔是什么叽唱? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮微宝,結(jié)果婚禮上棺亭,老公的妹妹穿的比我還像新娘。我一直安慰自己蟋软,他們只是感情好镶摘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岳守,像睡著了一般凄敢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湿痢,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天涝缝,我揣著相機(jī)與錄音扑庞,去河邊找鬼。 笑死拒逮,一個(gè)胖子當(dāng)著我的面吹牛罐氨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滩援,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栅隐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了玩徊?” 一聲冷哼從身側(cè)響起租悄,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恩袱,沒想到半個(gè)月后恰矩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憎蛤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年外傅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俩檬。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萎胰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棚辽,到底是詐尸還是另有隱情技竟,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布屈藐,位于F島的核電站榔组,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏联逻。R本人自食惡果不足惜搓扯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望包归。 院中可真熱鬧锨推,春花似錦、人聲如沸公壤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厦幅。三九已至沾鳄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間确憨,已是汗流浹背译荞。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工套媚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磁椒。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像玫芦,于是被迫代替她去往敵國(guó)和親浆熔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容