day11--express學(xué)習(xí)筆記

安裝express框架

備注:這個(gè)需要root權(quán)限
npm  install -g express-generator 全局安裝express框架
express -V可查詢express是否安裝成功
express -h 選項(xiàng)可列出所有可用的命令行選項(xiàng)

express建項(xiàng)目

在你想要生成項(xiàng)目的文件夾中執(zhí)行命令:
express myapp
創(chuàng)建項(xiàng)目時(shí)生成的文件及文件夾

然后cd進(jìn)入新建項(xiàng)目的目錄,安裝所有依賴包(主要是根據(jù)package.json這個(gè)文件里面的包進(jìn)行搜索安裝)

cd myapp
npm install
安裝的過程可能會(huì)比較緩慢,這個(gè)主要看網(wǎng)速了...不過我一下子就好了
然后cd進(jìn)入項(xiàng)目中bin目錄,啟動(dòng)項(xiàng)目
./www
如果在項(xiàng)目外可執(zhí)行./bin/www
最后在瀏覽器中輸入你當(dāng)前服務(wù)器ip地址以及端口號(hào)3000,便可以訪問...

express生成的應(yīng)用目錄結(jié)構(gòu)

|--  app.js
|--  bin
|     I__  www
|--  package.json
|--  public
|     I__  images
|     I__  javascripts
|     I__  stylesheets
|             I__style.css
I__  views
        |--  index.jade
        I--  error.jade
        I--  layout.jade

目錄詳細(xì)介紹

目錄結(jié)構(gòu)

bin 存放啟動(dòng)項(xiàng)目的腳本文件
node_modules 項(xiàng)目所有依賴的庫(kù),以及存放
package.json中安裝的模塊,添加依賴的模塊并安
裝后,存放在這個(gè)文件夾下
public 靜態(tài)文件(css,js,img)
routes 路由文件(mvc中cotroller)
views 頁(yè)面文件(jade模板) 可以更換模板e(cuò)js
package.json 存儲(chǔ)著工程的信息及模塊依賴
app.js 應(yīng)用核心配置文件(入口文件)
package.json文件
package.json用于項(xiàng)目依賴配置及開發(fā)者信
息,scripts屬性時(shí)用于定義操作命令,可以非常方便
的添加啟動(dòng)命令,比如默認(rèn)的start,用npm start代表
執(zhí)行node ./bin/www命令.擋在dependencies中添
加依賴的模塊時(shí),運(yùn)行npm install,npm會(huì)檢查當(dāng)前
目錄下的package.json,并自動(dòng)安裝所有指定的模塊

app.js 核心文件,也是項(xiàng)目入口文件

var express = require('express');
//用于處理目錄的對(duì)象,提高開發(fā)效率
var path = require('path');
//用于加載圖標(biāo)
var favicon = require('serve-favicon');
/在控制臺(tái)中,顯示req請(qǐng)求的信息
var logger = require('morgan');
//加載cooike模塊,用于獲取web瀏覽器發(fā)送的cookie中的內(nèi)容
var cookieParser = require('cookie-parser');
//解析客戶端請(qǐng)求的body中的內(nèi)容,內(nèi)部使用json編碼處理,url編碼處理以及對(duì)于文件的上傳處理
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

//生成一個(gè)express實(shí)例app
var app = express();

// view engine setup
//設(shè)置views文件夾,__dirname是node.js里面的全局變量,取得執(zhí)行js所在的路徑
app.set('views', path.join(__dirname, 'views'));
//視圖引擎設(shè)置
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//定義icon圖標(biāo),參數(shù)為圖標(biāo)的路勁,如果不指明,則用默認(rèn)的express圖標(biāo)
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
//加載日志中間件,定義日志和輸出級(jí)別
app.use(logger('dev'));
//加載解析json的中間件,接收json請(qǐng)求
app.use(bodyParser.json());
//加載解析urlencodeed請(qǐng)求體的中間件
app.use(bodyParser.urlencoded({ extended: false }));
//加載cookie的中間件
app.use(cookieParser());
//靜態(tài)文件目錄設(shè)置,設(shè)置public文件夾為存放靜態(tài)文件的目錄
app.use(express.static(path.join(__dirname, 'public')));

//路由控制器
app.use('/', routes);
app.use('/users', users);

//捕捉404錯(cuò)誤,并轉(zhuǎn)發(fā)到錯(cuò)誤處理器
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers
//開發(fā)環(huán)境下的500錯(cuò)誤處理器,將錯(cuò)誤信息渲染error模板并顯示到瀏覽器中
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

//生產(chǎn)環(huán)境下的錯(cuò)誤處理器,將錯(cuò)誤信息渲染error模板并顯示到瀏覽器中
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

//導(dǎo)出app實(shí)例供其他模塊調(diào)用
module.exports = app;

bin/www文件
www文件內(nèi)容:這里擁有著http服務(wù)器基本配置,www文件也是一個(gè)node腳本,用于分離配置和啟動(dòng)程序時(shí)用,代碼如下:

edwin@edwinxdf:~/express_demo/myapp/bin$ vim  www
//表明是node可執(zhí)行文件
#!/usr/bin/env node

/**
 * Module dependencies.
 */
//引入上面導(dǎo)出的app實(shí)例
var app = require('../app');
//引入debug模塊,打印調(diào)試日志
var debug = require('debug')('myapp:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */
//定義啟動(dòng)端口
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */
//端口標(biāo)準(zhǔn)化函數(shù)
function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */
//HTTP異常事件處理函數(shù)
function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */
//事件綁定函數(shù)
function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

routes
生成一個(gè)路由實(shí)例用來捕獲訪問主頁(yè)的get請(qǐng)求,導(dǎo)出這個(gè)路由并在app.js中通過app.use("/",routes);加載,這樣當(dāng)訪問主頁(yè)時(shí),就會(huì)調(diào)用res.render("index",{'title':'Express'});渲染views/index.jade模板并顯示到瀏覽器中

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;
關(guān)于路由,路由中有兩個(gè)常用功能:
app.route()函數(shù),創(chuàng)建可連接的途徑處理程序的路由路徑
express.Router類,創(chuàng)建模塊化安裝路徑的處理程序
app.Route方法會(huì)返回一個(gè)Route實(shí)例,它可以繼續(xù)使用所有的HTTP方法,包括get,post,all,put,delete,head等
app.route('/users')
    .get(function(req,res,next){})
    .post(function(req,res,next){})

express.Router類,則可以幫助我們更好的組織代碼結(jié)構(gòu),在app.js文件中,定義了app.use('/',routes);routes是指向了routes目錄下的index.js文件,./routes/index.js文件中,express.Router被定義使用,路徑/*處理都會(huì)由routes/index.js文件里的Router來處理,如果我們要管理不同的路口經(jīng),那么可以直接配置為多個(gè)不同的Router
1 app.use('/user', require('./routes/user').user);
2 app.use('/admin',require('./routes/admin').admin);
3 app.use('/', require('./routes'));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舆驶,一起剝皮案震驚了整個(gè)濱河市橱健,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沙廉,老刑警劉巖拘荡,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撬陵,居然都是意外死亡珊皿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門袱结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亮隙,“玉大人,你說我怎么就攤上這事垢夹∫缥牵” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵果元,是天一觀的道長(zhǎng)促王。 經(jīng)常有香客問我,道長(zhǎng)而晒,這世上最難降的妖魔是什么蝇狼? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮倡怎,結(jié)果婚禮上迅耘,老公的妹妹穿的比我還像新娘。我一直安慰自己监署,他們只是感情好颤专,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钠乏,像睡著了一般栖秕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晓避,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天簇捍,我揣著相機(jī)與錄音,去河邊找鬼俏拱。 笑死暑塑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锅必。 我是一名探鬼主播梯投,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了分蓖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尔许,失蹤者是張志新(化名)和其女友劉穎么鹤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體味廊,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒸甜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了余佛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柠新。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辉巡,靈堂內(nèi)的尸體忽然破棺而出恨憎,到底是詐尸還是另有隱情,我是刑警寧澤郊楣,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布憔恳,位于F島的核電站,受9級(jí)特大地震影響净蚤,放射性物質(zhì)發(fā)生泄漏钥组。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一今瀑、第九天 我趴在偏房一處隱蔽的房頂上張望程梦。 院中可真熱鬧,春花似錦橘荠、人聲如沸屿附。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拿撩。三九已至,卻和暖如春如蚜,著一層夾襖步出監(jiān)牢的瞬間压恒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工错邦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留探赫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓撬呢,卻偏偏與公主長(zhǎng)得像伦吠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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