express項(xiàng)目文件目錄說(shuō)明以及功能描述詳解
app.js:?jiǎn)?dòng)文件,或者說(shuō)入口文件
package.json:存儲(chǔ)著工程的信息及模塊依賴(lài),當(dāng)在 dependencies 中添加依賴(lài)的模塊時(shí),運(yùn)行 npm install,npm 會(huì)檢查當(dāng)前目錄下的 package.json,并自動(dòng)安裝所有指定的模塊
node_modules:存放 package.json 中安裝的模塊,當(dāng)你在 package.json 添加依賴(lài)的模塊并安裝后,存放在這個(gè)文件夾下
public:存放 image、css、js 等文件
routes:存放路由文件
views:存放視圖文件或者說(shuō)模版文件
bin:存放可執(zhí)行文件
打開(kāi)app.js,讓我們看看里面究竟有什么:
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); // 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 // 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 }); }); } // 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: {} }); }); module.exports = app;
這里我們通過(guò)require()加載了express、path 等模塊,以及 routes 文件夾下的index. js和 users.js 路由文件。 下面來(lái)講解每行代碼的含義。
(1) var app = express():生成一個(gè)express實(shí)例 app。
(2)app.set('views', path.join(__dirname, 'views')):設(shè)置 views 文件夾為存放視圖文件的目錄, 即存放模板文件的地方,__dirname 為全局變量,存儲(chǔ)當(dāng)前正在執(zhí)行的腳本所在的目錄。
(3)app.set('view engine', 'ejs'):設(shè)置視圖模板引擎為 ejs。
(4)app.use(favicon(__dirname + '/public/favicon.ico')):設(shè)置/public/favicon.ico為favicon圖標(biāo)。
(5)app.use(logger('dev')):加載日志中間件。
(6)app.use(bodyParser.json()):加載解析json的中間件。
(7)app.use(bodyParser.urlencoded({ extended: false })):加載解析urlencoded請(qǐng)求體的中間件。
(8)app.use(cookieParser()):加載解析cookie的中間件。
(9)app.use(express.static(path.join(__dirname, 'public'))):設(shè)置public文件夾為存放靜態(tài)文件的目錄。
(10)app.use('/', routes);和app.use('/users', users):路由控制器。
(11)
app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); });
捕獲404錯(cuò)誤,并轉(zhuǎn)發(fā)到錯(cuò)誤處理器。
(12)
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 }); }); }
開(kāi)發(fā)環(huán)境下的錯(cuò)誤處理器,將錯(cuò)誤信息渲染error模版并顯示到瀏覽器中。
(13)
app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); });
生產(chǎn)環(huán)境下的錯(cuò)誤處理器,不會(huì)將錯(cuò)誤信息泄露給用戶。
(14)module.exports = app :導(dǎo)出app實(shí)例供其他模塊調(diào)用。
我們?cè)倏?bin/www 文件:
#!/usr/bin/env node var debug = require('debug')('blog'); var app = require('../app'); app.set('port', process.env.PORT || 3000); var server = app.listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); });
(1)#!/usr/bin/env node:表明是 node 可執(zhí)行文件。
(2)var debug = require('debug')('blog'):引入debug模塊,打印調(diào)試日志。
(3)var app = require('../app'):引入我們上面導(dǎo)出的app實(shí)例。
(4)app.set('port', process.env.PORT || 3000):設(shè)置端口號(hào)。
(5)
var server = app.listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); });
啟動(dòng)工程并監(jiān)聽(tīng)3000端口,成功后打印 Express server listening on port 3000。
我們?cè)倏?routes/index.js 文件:
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res) { res.render('index', { title: 'Express' }); }); module.exports = router;
生成一個(gè)路由實(shí)例用來(lái)捕獲訪問(wèn)主頁(yè)的GET請(qǐng)求,導(dǎo)出這個(gè)路由并在app.js中通過(guò)app.use('/', routes); 加載。這樣,當(dāng)訪問(wèn)主頁(yè)時(shí),就會(huì)調(diào)用res.render('index', { title: 'Express' });渲染views/index.ejs模版并顯示到瀏覽器中。
我們?cè)倏纯?views/index.ejs 文件:
<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <h1><%= title %></h1> <p>Welcome to <%= title %></p> </body> </html>
在渲染模板時(shí)我們傳入了一個(gè)變量 title 值為 express 字符串,模板引擎會(huì)將所有 <%= title %> 替換為 express ,然后將渲染后生成的html顯示到瀏覽器中,如上圖所示。
在這一小節(jié)我們學(xué)習(xí)了如何創(chuàng)建一個(gè)工程并啟動(dòng)它,了解了工程的大體結(jié)構(gòu)和運(yùn)作流程,下一小節(jié)我們將學(xué)習(xí) express 的基本使用及路由控制。
總結(jié)
到此這篇關(guān)于express項(xiàng)目文件目錄說(shuō)明以及功能描述的文章就介紹到這了,更多相關(guān)express項(xiàng)目文件目錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js中path.resolve與path.join的區(qū)別與作用詳解
path.resolve和path.join都是屬于path核心模塊下的方法,用來(lái)拼接路徑,下面這篇文章主要給大家介紹了關(guān)于Node.js中path.resolve與path.join的區(qū)別與作用的相關(guān)資料,需要的朋友可以參考下2023-03-03socket.io學(xué)習(xí)教程之基本應(yīng)用(二)
socket.io提供了基于事件的實(shí)時(shí)雙向通訊,下面這篇文章主要給大家介紹了socket.io基本應(yīng)用的相關(guān)資料,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04Node.js利用Net模塊實(shí)現(xiàn)多人命令行聊天室的方法
Node.js Net 模塊提供了一些用于底層的網(wǎng)絡(luò)通信的小工具,包含了創(chuàng)建服務(wù)器/客戶端的方法,下面這篇文章主要給大家介紹了Node.js利用Net模塊實(shí)現(xiàn)命令行多人聊天室的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12Node.js實(shí)現(xiàn)登陸注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了Node.js實(shí)現(xiàn)登陸注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08node爬取新型冠狀病毒的疫情實(shí)時(shí)動(dòng)態(tài)
這篇文章主要介紹了node爬取新型冠狀病毒的疫情實(shí)時(shí)動(dòng)態(tài),非常不錯(cuò),本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2020-02-02win系統(tǒng)下nodejs環(huán)境安裝配置
這篇文章主要介紹了win系統(tǒng)下nodejs環(huán)境安裝配置的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05詳解使用Typescript開(kāi)發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置)
本篇文章主要介紹了詳解使用Typescript開(kāi)發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10使用Node.js自動(dòng)生成帶動(dòng)態(tài)圖表的Word文檔
在現(xiàn)代軟件開(kāi)發(fā)中,動(dòng)態(tài)生成?Word?文檔是一項(xiàng)非常常見(jiàn)的需求,本文將結(jié)合Node.js和ECharts實(shí)現(xiàn)自動(dòng)生成帶動(dòng)態(tài)圖表的Word文檔,感興趣的可以了解下2024-03-03