基于Express搭建開(kāi)發(fā)環(huán)境

對(duì)于一個(gè)前端開(kāi)發(fā)人員來(lái)說(shuō)歇式,node.js可以說(shuō)是開(kāi)發(fā)后端的福音每强。本人畢設(shè)項(xiàng)目使用的是asp.net(只是使用ashx來(lái)接收前端的ajax逻住,并沒(méi)有使用那些惡心的控件)创葡,通過(guò)對(duì)比發(fā)現(xiàn)整個(gè)項(xiàng)目都使用js實(shí)在是幸福蛮浑。

Node.js

關(guān)于node.js的優(yōu)點(diǎn)就不再多說(shuō)唠叛,網(wǎng)上一搜一大堆,項(xiàng)目也可以找到很多沮稚。這里主要說(shuō)一下node.js關(guān)于搭建web應(yīng)用這一塊的缺點(diǎn)艺沼。
眾所周知,node.js需要自己搭建服務(wù)器蕴掏,也就是說(shuō)你需要自己監(jiān)聽(tīng)一個(gè)端口并啟動(dòng)它

var http=require('http');
http.createServer(function(req,res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write("hello sunnychuan");
    res.end();
}).listen(3000);
console.log("server is running!");

這里有一本電子書(shū)幫助你使用原生的node.js搭建web應(yīng)用障般,點(diǎn)擊這里

不僅僅是監(jiān)聽(tīng)端口,我們往往會(huì)根據(jù)用戶(hù)輸入的url從本地找到相應(yīng)文件并將它寫(xiě)回請(qǐng)求

fs.exists(filePath,function(exists){
    if(exists){
       res.writeHead(200,{'Content-Type':contentType});
       var stream=fs.createReadStream(filePath);
       stream.on('error',function(){
          res.writeHead(500,{'Content-Type':'text/html'});
          res.end('<h1>500 Server Error</h1>');
       });
       stream.pipe(res);
    }
}

我們還會(huì)針對(duì)前端的ajax請(qǐng)求做路由處理

//根據(jù)不同的路徑調(diào)用不同的處理程序
var handle={};
handle["/api/get.json"]=requestHandlers.get;
handle["/api/post.json"]=requestHandlers.post;
function route(handle,pathname,req,res){
    if(typeof handle[pathname]==='function'){
        handle[pathname](req,res);
    }
    else{
        res.writeHead(404,{'Content-Type':'text/html'});
        res.write('<h1>404 Not Found</h1>');
        res.end();
    }
}
var pathname=decodeURI(url.parse(req.url).pathname);
if(path.extname(pathname)=='.json'){
    route(handle,pathname,req,res);
}

通過(guò)上面那么一折騰盛杰,原本的熱情就消退了一半挽荡,這里我推薦一下express框架,官方文檔在這里

Express

安裝和目錄結(jié)構(gòu)

首先安裝express

npm install express --save-dev

安裝express的應(yīng)用生成器

npm install express-generator -g

使用它的應(yīng)用生成器可以很快建立一個(gè)項(xiàng)目

express myapp

然后進(jìn)入到該文件夾下即供,安裝所有依賴(lài)

cd myapp
npm install

你的目錄結(jié)構(gòu)長(zhǎng)這個(gè)樣子

bin是啟動(dòng)項(xiàng)定拟,在bin/www里面你可以修改端口號(hào)
node_modules用來(lái)存放npm安裝的模塊
public里面用來(lái)存放資源
routes是路由控制,存放了所有的處理程序
views是視圖文件逗嫡,相當(dāng)于html頁(yè)青自,在routes中會(huì)使用類(lèi)似

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

這樣的代碼來(lái)替換模板引擎里的內(nèi)容株依,有點(diǎn)像java的.jsp文件和asp.net的.asp文件
app.js用來(lái)配置express,你可以在這里進(jìn)行路由分配和錯(cuò)誤處理并按需加載中間件

啟動(dòng)項(xiàng)目

npm start

修改代碼

作為前端開(kāi)發(fā)的你延窜,也許會(huì)厭惡由后端直接將數(shù)據(jù)渲染在頁(yè)面上(至少我是這樣)恋腕,我們通常使用ajax來(lái)進(jìn)行前后端交互并自行處理后端的數(shù)據(jù),因此整個(gè)views文件就可以直接delete掉了逆瑞。

step1 更改目錄結(jié)構(gòu)
把public更名為client荠藤,新建server文件夾并把routes和app.js放到里面(views直接刪除即可),這樣一來(lái)整個(gè)項(xiàng)目結(jié)構(gòu)就比較明顯了呆万,客戶(hù)端和服務(wù)端分離商源。

step2 修改routes文件夾
routes里默認(rèn)有index.js和users.js兩個(gè)路由文件,其中index.js是負(fù)責(zé)模板渲染的

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

而users.js是直接返回一個(gè)字符串

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;

既然我們刪掉了views谋减,那么index.js的代碼肯定要修改的牡彻。我刪掉了這兩個(gè)文件,并新建了get.js和post.js文件用來(lái)接收和處理前端的ajax請(qǐng)求

//get.js
module.exports=function(req,res){
  console.log(req.query.userName);
  res.json({code:200,data:"this is a get request"});
}
//post.js
module.exports=function(req,res){
    console.log(req.body.userName);
    console.log(req.body.password);
    res.json({code:200,data:"this is a post request"});
}

另外出爹,我還新建了一個(gè)名為router.js的文件庄吼,用來(lái)分配路由(默認(rèn)是在app.js文件中進(jìn)行路由分配的,但是一旦請(qǐng)求過(guò)多严就,app.js會(huì)十分冗長(zhǎng))

var express=require('express');
var router=express.Router();

var get=require('./get');
var post=require('./post');

router.get('/get.json',get);
router.post('/post.json',post);
module.exports=router;

step3 修改app.js
對(duì)模塊加載做如下修改

//修改前
var index = require('./routes/index');
var users = require('./routes/users');
//修改后
var router=require('./routes/router.js');

刪掉視圖引擎的設(shè)置

//刪除下面的代碼
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

對(duì)靜態(tài)資源的加載做一些更改总寻,默認(rèn)是在"public"文件夾下讀取并加載靜態(tài)資源的,現(xiàn)在我們?cè)O(shè)置為先從根路徑讀取文件梢为,如果不存在則從"client"中讀取文件

//修改前
app.use(express.static(path.join(__dirname, 'public')));
//修改后
var rootDir=path.resolve(__dirname);
var projectDir=path.resolve(__dirname,'../','client');
app.use(express.static(rootDir));
app.use(express.static(projectDir));

替換默認(rèn)的路由加載渐行,改為上面require的router。/api是一個(gè)虛擬路徑铸董,這樣每當(dāng)我們?cè)L問(wèn)/api/xxx.json就會(huì)通過(guò)路由來(lái)分配不同的控制器完成業(yè)務(wù)邏輯

//修改前
app.use('/', index);
app.use('/users', users);
//修改后
app.use('/api',router);

我們還需要讓根路徑加載首頁(yè)面

app.get('/', function(req, res){
  res.sendFile(projectDir+'/index.html');
});

由于不需要渲染視圖祟印,因此錯(cuò)誤頁(yè)面的處理也要進(jìn)行修改,我這里僅僅是把錯(cuò)誤信息返回給前端

//修改前
app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});
//修改后
app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  res.status(err.status || 500);
  res.json({code:500,msg:"error"});
});

測(cè)試

我們需要編寫(xiě)前端代碼進(jìn)行測(cè)試粟害,這里我使用angular簡(jiǎn)單地發(fā)送get和post請(qǐng)求

angular.module("indexApp",[])
.controller("IndexCtrl",function($scope,$http){
    $scope.get=function(){
        $http({
            method:"get",
            url:"/api/get.json",
            params:{userName:"sunnychuan"}
        }).then(function(res){
            if(res.data.code==200){
                console.log(res.data.data);
            }
            else if(res.data.code==500){
                console.log(res.data.msg);
            }
        })
    }
    $scope.post=function(){
        $http({
            method:"post",
            url:"/api/post.json",
            data:{userName:"sunnychuan",password:"qc"}
        }).then(function(res){
            if(res.data.code==200){
                console.log(res.data.data);
            }
            else if(res.data.code==500){
                console.log(res.data.msg);
            }
        })
    }
})

同樣的蕴忆,使用npm start啟動(dòng)項(xiàng)目,在url中輸入localhost:3000

點(diǎn)擊get按鈕

點(diǎn)擊post按鈕


至此悲幅,基本的環(huán)境搭建成功套鹅,搭配mongodb會(huì)在之后的文章中介紹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汰具,一起剝皮案震驚了整個(gè)濱河市卓鹿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郁副,老刑警劉巖减牺,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拔疚,警方通過(guò)查閱死者的電腦和手機(jī)肥隆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稚失,“玉大人栋艳,你說(shuō)我怎么就攤上這事【涓鳎” “怎么了吸占?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凿宾。 經(jīng)常有香客問(wèn)我矾屯,道長(zhǎng),這世上最難降的妖魔是什么初厚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任件蚕,我火速辦了婚禮,結(jié)果婚禮上产禾,老公的妹妹穿的比我還像新娘排作。我一直安慰自己,他們只是感情好亚情,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布妄痪。 她就那樣靜靜地躺著,像睡著了一般楞件。 火紅的嫁衣襯著肌膚如雪衫生。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天土浸,我揣著相機(jī)與錄音障簿,去河邊找鬼。 笑死栅迄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皆怕。 我是一名探鬼主播毅舆,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愈腾!你這毒婦竟也來(lái)了憋活?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤虱黄,失蹤者是張志新(化名)和其女友劉穎悦即,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辜梳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年粱甫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片作瞄。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茶宵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宗挥,到底是詐尸還是另有隱情乌庶,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布契耿,位于F島的核電站瞒大,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搪桂。R本人自食惡果不足惜透敌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锅棕。 院中可真熱鬧拙泽,春花似錦、人聲如沸裸燎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)德绿。三九已至荷荤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間移稳,已是汗流浹背蕴纳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留个粱,地道東北人古毛。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像都许,于是被迫代替她去往敵國(guó)和親稻薇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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