littleAlbum 項(xiàng)目流程

  • 新建項(xiàng)目文件夾 littleAlbum
  • littleAlbum 中建立 MVC 三個(gè)文件夾
  • littleAlbum 建立 public 文件夾存放靜態(tài)資源
  • littleAlbum 建立 uploads 文件夾存放路由資源
  • 每一個(gè)項(xiàng)目都有一個(gè) app.js 文件作為入口文件
  • 通過 cmd 命令行輸入 npm init 來初始化項(xiàng)目生成 package.json 文件
  • 在 public 文件夾下建立 css\fonts\images\js 等靜態(tài)資源文件夾
  • 在 views 文件夾下創(chuàng)建 ejs 文件,用于渲染路由界面
  • 命令行輸入 npm install express --save 引入 express 功能包 --save 是將修改信息更新到 package.json 文件纤虽,生成 node_modules 文件夾

在 app.js 中設(shè)置模版

  • 命令行輸入 npm install ejs --save
var express = require('express');
var app = express();
//設(shè)置模版
app.set('view engine','ejs');
//設(shè)置中間件
//設(shè)置靜態(tài)資源
app.use(express.static('./public'));
  • 在 controllers 文件夾下建立 router.js 文件轰传,建立package.json 文件抱婉,并修改package.json 中的 main 使其指向 router.js 文件
  • 在 router.js 文件中實(shí)現(xiàn)模版渲染
//在這個(gè)文件中,我們需要設(shè)置一些函數(shù),用來處理接收到路由后的設(shè)置
//設(shè)置當(dāng)接收到默認(rèn)路由后的處理函數(shù)
exports.showIndex = function(req,res,next){
    //res.render('index',{albums:['小貓','小狗','小白']})
}

在 app.js 文件中設(shè)置顯示主界面路由

//設(shè)置默認(rèn)的路徑
//當(dāng)我們接受到對應(yīng)的請后,我們需要做出處理,為了方便后面的復(fù)用代碼的管理
//我們最好設(shè)置一個(gè)文件用來管理接受到路由后的處理
//一般這個(gè)屬于用來控制界面的設(shè)置,所以我們放在控制器中
app.get('/',router.showIndex)

在 app.js 中引入 router.js;```var router = require('./controllers');

  • 在 app.js 中調(diào)用 app.get('/',router.showIndex);
  • 在實(shí)際開發(fā)中,渲染時(shí)的數(shù)據(jù)艳吠,是通過 models 下面對應(yīng)的文件來獲取的,這樣數(shù)據(jù)才是動(dòng)態(tài)的孽椰,可以提升代碼擴(kuò)展性
  • models 文件夾下創(chuàng)建 files.js 文件用來處理數(shù)據(jù)
  • 將所有數(shù)據(jù)文件夾放在 uploads 文件夾下
  • file.js 文件
//讀取文件導(dǎo)入 fs 包
var fs = require('fs');
exports.showAllAlbum = function(callBack){
    //讀取文件夾下的信息
    fs.readdir('./uploads',function(err,files){
        if(err){
            callBack('沒有這個(gè)目錄',null);
            return;
        };
        //利用閉包遍歷文件夾下所有文件昭娩,并判斷是否是文件夾
        //創(chuàng)建一個(gè)數(shù)組儲存文件夾
        var albumArr = [];
        (function iterator(i){
            //判斷停止條件
            if(i == files.length){
                console.log(albumArr);
                callBack(null,albumArr);
                return;
            };
            fs.stat('./uploads/',function(err,stats){
                if(stats.isDirectory()){
                    albumArr.push(files[i]);
                };
                iterartor(i+1);
            })
        })(0)
    })
}
  • 配置 router.js 文件
//導(dǎo)入數(shù)據(jù)模型包
var file = require('../models/file.js');
exports.showIndex = function(req,res,next){
    //res.render('index',{albums:['小貓','小狗','小白']})
    //因?yàn)?showAllAlbum 里面有回調(diào)黍匾,那么可能我們在渲染的時(shí)候栏渺,回調(diào)還沒有回來,就沒有對應(yīng)的數(shù)據(jù)可以渲染
    //所以在調(diào)用對應(yīng)的函數(shù)的時(shí)候直接設(shè)置回調(diào)膀捷,然后在對應(yīng)的回調(diào)中處理渲染
    file.showAllAlbum(function(err,albums){
        if(err){
            next();
            return;
        };
        res.render('index',{
            albums:albums;
        })
    })
}

設(shè)置點(diǎn)擊顯示文件夾下文件

  • app.js 文件中設(shè)置點(diǎn)擊路由
  • 因?yàn)樾枰虞d文件夾下的圖片資源是靜態(tài)資源迈嘹,所以先用 static 加載
//當(dāng)我們加載圖片的時(shí)候,如果放在對應(yīng)的public下面的時(shí)候,會(huì)給對應(yīng)的餓public做靜態(tài)路由
//所以下面的圖片可以直接讀取到
//但是我們?nèi)绻麖膗ploads中獲取出來的的圖片,需要顯示到界面上的時(shí)候,需要給圖片設(shè)置路由
//所以我們可以給uploads中的資源設(shè)置靜態(tài)路由
//一個(gè)node程序中可以設(shè)置多個(gè)靜態(tài)路由
app.use(express.static('./uploads'));
//設(shè)置點(diǎn)擊跳轉(zhuǎn)路由,因?yàn)樾枰邮账c(diǎn)擊的是哪個(gè)文件夾,所以需要傳遞參數(shù)
app.get('/:albumName',router.showImages);
  • 在 file.js 文件中處理數(shù)據(jù)
exports.showAllImage = function(albumName,callBack){
    fs.readdir('./uploads/'+albumName,function(err,files){
        if(err){
            callBack('沒有這個(gè)目錄',null);
            return;
        };
        var imagesArr = []
        (function iterator(i){
            if(i == files.length){
                callBack(null,imagesArr);
                console.log(imagesArr);
                return;
            };
            fs.stat('./uploads/'+albumName+'/'+files[i],function(err,stat){               
                imagesArr.push(files[i]);
            });
            iterator(i+1);
        })(0)

    })
}
  • 在 router.js 文件中處理數(shù)據(jù)的渲染
  • 在 views 文件夾下建立 album.js 文件秀仲,顯示圖片的模版
exports.showImages = function(req,res,next){
    //獲取點(diǎn)擊時(shí)傳過來的參數(shù)
    var albumName = req.params.albumName;
    file.showAllImage(albumName,function(err,imagesArray){
        if(err){
            next();
            return;
        };
        res.render('album',{
            albumname:albumName,
            images:imagesArray
        })
    })
}

設(shè)置上傳界面路由

  • 在 app.js 文件中融痛,設(shè)置點(diǎn)擊路由
app.get('/up',router.showUp);
  • 在 router.js 中配置路由
  • 在 views 文件夾中建立 up.ejs 模版
exports.showUp = function(req,res,next){
    file.showAllAlbum(function(err,albums){
        if(err){
            next();
            return;
        };
        res.render('up',{albums:albums})
    })
}

設(shè)置文件的上傳

  • 在 app.js 中設(shè)置文件上傳的 post 請求
app.post('/up',router.doPost)
  • 在 router.js 文件中控制文件上傳
  • 命令行中輸入npm install formidable --save 安裝 formidable 工具包,并且在 router.js 中引入;
  • 創(chuàng)建文件夾 tempload存儲上傳上來的文件
var formidable = require('formidable');
exports.doPost = function(req,res,next){
    var form = new formidable.IncomingForm();
    //設(shè)置上傳的路徑
    //在node中,凡是和文件操作有關(guān)的路徑的設(shè)置,尤其是需要引入包的一些文件,我們可以使用當(dāng)前的盤符作為基本的
    form.uploadDir('./tempload');
    //解析對應(yīng)的文件,使用parse
    form.parse(req,function(err){
        if(err){
            next();
            return;
        };
        res.send('success');
    })
}

設(shè)置顯示錯(cuò)誤頁面

  • 在 views 文件夾中建立 err.ejs 文件編寫顯示錯(cuò)誤頁面
  • 在 app.js 中直接直接操作渲染
//設(shè)置一個(gè)錯(cuò)誤路由,如果上面所有的都沒有匹配到,我們就設(shè)置錯(cuò)誤的路由,無論是get還是post,我們都要設(shè)置
//錯(cuò)誤路由,所以使用use,上面所有的路由都匹配完成后,其余的路由都是錯(cuò)誤頁面
//所以我們可以直接使用use(funtion)
app.use('/',function(req,res){
    res.render('err');
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末神僵,一起剝皮案震驚了整個(gè)濱河市雁刷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌保礼,老刑警劉巖沛励,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炮障,居然都是意外死亡目派,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門胁赢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來企蹭,“玉大人,你說我怎么就攤上這事智末×律悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵系馆,是天一觀的道長送漠。 經(jīng)常有香客問我,道長由蘑,這世上最難降的妖魔是什么闽寡? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮纵穿,結(jié)果婚禮上下隧,老公的妹妹穿的比我還像新娘。我一直安慰自己谓媒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布何乎。 她就那樣靜靜地躺著句惯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪支救。 梳的紋絲不亂的頭發(fā)上抢野,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音各墨,去河邊找鬼指孤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恃轩。 我是一名探鬼主播结洼,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叉跛!你這毒婦竟也來了松忍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤筷厘,失蹤者是張志新(化名)和其女友劉穎鸣峭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酥艳,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摊溶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了充石。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莫换。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赫冬,靈堂內(nèi)的尸體忽然破棺而出浓镜,到底是詐尸還是另有隱情,我是刑警寧澤劲厌,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布膛薛,位于F島的核電站,受9級特大地震影響补鼻,放射性物質(zhì)發(fā)生泄漏哄啄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一风范、第九天 我趴在偏房一處隱蔽的房頂上張望咨跌。 院中可真熱鬧,春花似錦硼婿、人聲如沸锌半。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刊殉。三九已至,卻和暖如春州胳,著一層夾襖步出監(jiān)牢的瞬間记焊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工栓撞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遍膜,地道東北人碗硬。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像瓢颅,于是被迫代替她去往敵國和親恩尾。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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