国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

express web的一款mvc框架

_ang / 3052人閱讀

摘要:相關(guān)的網(wǎng)站開(kāi)發(fā)有這么常用的四款數(shù)據(jù)層視圖層控制層框架,我們今天說(shuō)一下阿里的框架是一個(gè)自身功能極簡(jiǎn),完全是由路由和中間件構(gòu)成一個(gè)的開(kāi)發(fā)框架安裝創(chuàng)建一個(gè)目錄通過(guò)命令為你的應(yīng)用創(chuàng)建一個(gè)文件。修改請(qǐng)求和響應(yīng)對(duì)象。注意只對(duì)使用或加載的中間件有效。

express

express相關(guān)的網(wǎng)站
*http://expressjs.com/
*http://www.expressjs.com.cn/
*https://github.com/pugjs/pug
*https://pug.bootcss.com/api/g...

web開(kāi)發(fā)有這么常用的四款mvc (model(數(shù)據(jù)層) view(視圖層) controller(控制層))框架,我們今天說(shuō)一下express

*express
*koa
*阿里的egg框架
*thinkjs

express()

Express 是一個(gè)自身功能極簡(jiǎn),完全是由路由和中間件構(gòu)成一個(gè)的 web 開(kāi)發(fā)框架

安裝

創(chuàng)建一個(gè)目錄

$ mkdir myapp
$ cd myapp  

通過(guò) npm init 命令為你的應(yīng)用創(chuàng)建一個(gè) package.json 文件。

$ npm init  

然后需要我們自己在目錄下創(chuàng)建一個(gè)app.js 文件
接下來(lái)安裝 Express 并將其保存到依賴(lài)列表中:

$ npm install express --save  
Hello world 實(shí)例 app.js
var express = require("express");//引入模塊
var app = express();//調(diào)用函數(shù)

app.get("/", function (req, res) {
  res.send("Hello World!");
});//請(qǐng)求Hello World!

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log("Example app listening at http://%s:%s", host, port);
});  //啟動(dòng)

運(yùn)行下面命令

$ node app.js  

然后在瀏覽器中打開(kāi) http://localhost:3000/ 并查看輸出結(jié)果。

express 應(yīng)用生成器

通過(guò)應(yīng)用生成器工具 express 可以快速創(chuàng)建一個(gè)應(yīng)用的腳手架。
命令行安裝

$ npm install express-generator -g  

在當(dāng)前工作目錄下創(chuàng)建一個(gè)命名為 myapp1 的應(yīng)用。(和myapp同級(jí))

$ express myapp  

安裝依賴(lài)包:

$ cd myapp 
$ npm install  

啟動(dòng)這個(gè)應(yīng)用(MacOS 或 Linux 平臺(tái)):

$ DEBUG=myapp npm start  

Windows 平臺(tái)使用如下命令:

set DEBUG=myapp & npm start  

然后在瀏覽器中打開(kāi) http://localhost:3000/ 網(wǎng)址就可以看到這個(gè)應(yīng)用了

express路由

路由是指如何定義應(yīng)用的端點(diǎn)(URIs)以及如何響應(yīng)客戶(hù)端的請(qǐng)求

我們可以在routes這個(gè)文件夾下創(chuàng)建一個(gè)文件order.js來(lái)詳細(xì)的說(shuō)一下路由的用法。
order.js

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

router.get("/", function(req, res, next) {
  res.render("order",{msg:"我的訂單"});
});
router.get("/list", function(req, res, next) {
  res.send("訂單列表");
});


module.exports = router;

app.js

var order = require("./routes/order");//引入roder.js
app.use("/order", order);
Express 模板引擎(本博客開(kāi)頭有網(wǎng)址關(guān)于 pug(jade)的)

模板引擎有這么幾類(lèi)pug(jade) ejs handlerbars(擴(kuò)展模塊)
需要在應(yīng)用中進(jìn)行如下設(shè)置才能讓 Express 渲染模板文件:
*views, 放模板文件的目錄,比如: app.set("views", "./views")
*view engine, 模板引擎,比如: app.set("view engine", "jade")

然后安裝相應(yīng)的模板引擎 npm 軟件包。

$ npm install jade --save
$ npm install ejs --save

需要那種就在app.set("view engine", "jade")里將"jade"改成那種。
在 views 目錄下生成名為 order.jade 的 Jade 模板文件,內(nèi)容如下:

doctype html
html
  head
    title 訂單
  body
    h1 #{msg}

然后使用路由渲染它:

router.get("/",function(req,res,nest){
    res.render("orders",{msg:"訂單首頁(yè)"})
})
Express 托管靜態(tài)文件

通過(guò) Express 內(nèi)置的 express.static 可以方便地托管靜態(tài)文件,例如圖片、CSS、JavaScript 文件等。

將靜態(tài)資源文件所在的目錄作為參數(shù)傳遞給 express.static 中間件就可以提供靜態(tài)資源文件的訪(fǎng)問(wèn)了。例如,假設(shè)在 public 目錄放置了圖片、CSS 和 JavaScript 文件,你就可以:

app.use(express.static("public"));

如果你的靜態(tài)資源存放在多個(gè)目錄下面,你可以多次調(diào)用 express.static 中間件:

app.use(express.static("public"));
app.use(express.static("files"));

你就可以通過(guò)帶有 “/static” 前綴的地址來(lái)訪(fǎng)問(wèn) public 目錄下面的文件了。

http://localhost:3000/static/images/kitten.jpg
http://localhost:3000/static/css/style.css
http://localhost:3000/static/js/app.js
http://localhost:3000/static/images/bg.png
http://localhost:3000/static/hello.html
中間件

中間件(Middleware) 是一個(gè)函數(shù),它可以訪(fǎng)問(wèn)請(qǐng)求對(duì)象(request object (req)), 響應(yīng)對(duì)象(response object (res)), 和 web 應(yīng)用中處于請(qǐng)求-響應(yīng)循環(huán)流程中的中間件,一般被命名為 next 的變量。

中間件的功能包括:

*執(zhí)行任何代碼。
*修改請(qǐng)求和響應(yīng)對(duì)象。
*終結(jié)請(qǐng)求-響應(yīng)循環(huán)。
*調(diào)

中間件種類(lèi):

*應(yīng)用級(jí)中間件
*路由級(jí)中間件
*錯(cuò)誤處理中間件
*內(nèi)置中間件
*第三方中間件

應(yīng)用級(jí)中間件

應(yīng)用級(jí)中間件綁定到 app 對(duì)象 使用 app.use() 和 app.METHOD(), 其中, METHOD 是需要處理的 HTTP 請(qǐng)求的方法,例如 GET, PUT, POST 等等,全部小寫(xiě)。例如:

var app = express();

// 沒(méi)有掛載路徑的中間件,應(yīng)用的每個(gè)請(qǐng)求都會(huì)執(zhí)行該中間件
app.use(function (req, res, next) {
  console.log("Time:", Date.now());
  next();
});

// 掛載至 /user/:id 的中間件,任何指向 /user/:id 的請(qǐng)求都會(huì)執(zhí)行它
app.use("/user/:id", function (req, res, next) {
  console.log("Request Type:", req.method);
  next();
});

// 路由和句柄函數(shù)(中間件系統(tǒng)),處理指向 /user/:id 的 GET 請(qǐng)求
app.get("/user/:id", function (req, res, next) {
  res.send("USER");
});

在下面的例子中,為指向 /user/:id 的 GET 請(qǐng)求定義了兩個(gè)路由。第二個(gè)路由雖然不會(huì)帶來(lái)任何問(wèn)題,但卻永遠(yuǎn)不會(huì)被調(diào)用,因?yàn)榈谝粋€(gè)路由已經(jīng)終止了請(qǐng)求-響應(yīng)循環(huán)

// 一個(gè)中間件棧,處理指向 /user/:id 的 GET 請(qǐng)求
app.get("/user/:id", function (req, res, next) {
  console.log("ID:", req.params.id);
  next();
}, function (req, res, next) {
  res.send("User Info");
});

// 處理 /user/:id, 打印出用戶(hù) id
app.get("/user/:id", function (req, res, next) {
  res.end(req.params.id);
});

如果需要在中間件棧中跳過(guò)剩余中間件,調(diào)用 next("route") 方法將控制權(quán)交給下一個(gè)路由。 注意: next("route") 只對(duì)使用 app.VERB() 或 router.VERB() 加載的中間件有效。

路由級(jí)中間件

路由級(jí)中間件和應(yīng)用級(jí)中間件一樣,只是它綁定的對(duì)象為 express.Router()。

var router = express.Router();

路由級(jí)使用 router.use() 或 router.VERB() 加載。

var app = express();
var router = express.Router();

// 沒(méi)有掛載路徑的中間件,通過(guò)該路由的每個(gè)請(qǐng)求都會(huì)執(zhí)行該中間件
router.use(function (req, res, next) {
  console.log("Time:", Date.now());
  next();
});

// 一個(gè)中間件棧,顯示任何指向 /user/:id 的 HTTP 請(qǐng)求的信息
router.use("/user/:id", function(req, res, next) {
  console.log("Request URL:", req.originalUrl);
  next();
}, function (req, res, next) {
  console.log("Request Type:", req.method);
  next();
});

// 一個(gè)中間件棧,處理指向 /user/:id 的 GET 請(qǐng)求
router.get("/user/:id", function (req, res, next) {
  // 如果 user id 為 0, 跳到下一個(gè)路由
  if (req.params.id == 0) next("route");
  // 負(fù)責(zé)將控制權(quán)交給棧中下一個(gè)中間件
  else next(); //
}, function (req, res, next) {
  // 渲染常規(guī)頁(yè)面
  res.render("regular");
});

// 處理 /user/:id, 渲染一個(gè)特殊頁(yè)面
router.get("/user/:id", function (req, res, next) {
  console.log(req.params.id);
  res.render("special");
});

// 將路由掛載至應(yīng)用
app.use("/", router);
錯(cuò)誤處理中間件

錯(cuò)誤處理中間件和其他中間件定義類(lèi)似,只是要使用 4 個(gè)參數(shù),而不是 3 個(gè),其簽名如下: (err, req, res, next)。

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send("Something broke!");
});
內(nèi)置中間件

express.static(root, [options])

express.static 是 Express 唯一內(nèi)置的中間件。它基于 serve-static,負(fù)責(zé)在 Express 應(yīng)用中提托管靜態(tài)資源。

參數(shù) root 指提供靜態(tài)資源的根目錄。
下面的例子使用了 express.static 中間件,其中的 options 對(duì)象經(jīng)過(guò)了精心的設(shè)計(jì)。

var options = {
  dotfiles: "ignore",
  etag: false,
  extensions: ["htm", "html"],
  index: false,
  maxAge: "1d",
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set("x-timestamp", Date.now());
  }
}

app.use(express.static("public", options));
第三方中間件

通過(guò)使用第三方中間件從而為 Express 應(yīng)用增加更多功能。

安裝所需功能的 node 模塊,并在應(yīng)用中加載,可以在應(yīng)用級(jí)加載,也可以在路由級(jí)加載。

進(jìn)程管理器

在編寫(xiě)程序時(shí),我們發(fā)現(xiàn),每次更改文件之后,都需要在命令行內(nèi)停止當(dāng)前的服務(wù),然后輸入 npm start ,很麻煩。我們需要一款自動(dòng)刷新的工具

pm2

安裝:

npm install pm2 -gd

啟動(dòng)

pm2 start ./bin/www --watch
PS D:
ode.jscode