express框架API解析

原始鏈接:https://segmentfault.com/a/1190000010190604#articleHeader22

1.Express簡(jiǎn)介

Express是基于Node.js平臺(tái)、快速、開(kāi)放、極簡(jiǎn)的web開(kāi)發(fā)框架,它提供了一系列強(qiáng)大的特性,幫助你創(chuàng)建各種web和移動(dòng)設(shè)備應(yīng)用。
Express不對(duì)Node.js已有特性進(jìn)行二次抽象,我們只是在它之上擴(kuò)展了web應(yīng)用所需的基本功能。
注意:Express是一個(gè)自身功能極簡(jiǎn),完全是由路由和中間件構(gòu)成的一個(gè)web開(kāi)發(fā)框架:從本質(zhì)上來(lái)說(shuō),一個(gè)Express應(yīng)用就是在調(diào)用各種中間件。
API方面:豐富的HTTP快捷方法和任意排列組合的Connect中間件,讓你創(chuàng)建健壯、友好的API變得既快速又簡(jiǎn)單。
特性:

  • Robust routing
  • Focus on high performance
  • Super-high test coverage
  • HTTP helpers(redirection, caching, etc)
  • View system supporting 14+ template engines
  • Content negotiation
  • Executable for generating applications quickly
安裝和hello world

--save:安裝模塊時(shí),如果制定了--save參數(shù),那么此模塊將被添加到package.json文件中的dependencies依賴列表中,然后通過(guò)npm install命令即可自動(dòng)安裝依賴列表中所列出的所有模塊。如果只是臨時(shí)安裝,不想把它添加到依賴列表中,只要省略--save參數(shù)就可以。
tips:項(xiàng)目文件夾的名字和所要安裝的項(xiàng)目依賴不能重名。(例如創(chuàng)建了一個(gè)名為express的項(xiàng)目文件及,如果初始化后,安裝express。會(huì)報(bào)錯(cuò):Refusing to install express as a dependency of itself。)

# 工作目錄
$ mkdir myapp
$ cd myapp

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

# 應(yīng)用的入口文件
entry point: app.js

# 安裝Express并將其保存在依賴列表中
$ npm install express --save

下面的代碼啟動(dòng)一個(gè)服務(wù)并監(jiān)聽(tīng)從3000端口進(jìn)入的所有連接請(qǐng)求。他將對(duì)所有(/)URL或路由返回hello world字符串。對(duì)于其他所有路徑返回404 Not Found。
req(request,請(qǐng)求)和res(response, 響應(yīng))與Node提供的對(duì)象完全一致,因此,你可以調(diào)用req.pipe(),req.on('data', callback)以及任何Node提供的方法。

const express = require('express');
let app = express();

app.get('/', function(req, res) {
  res.send('hello world');
});

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

  console.log(`app listening at port: ${port}`);
});
# 啟動(dòng)此應(yīng)用
$ node app.js

http://localhost:3000/
Express應(yīng)用生成器

通過(guò)應(yīng)用生成器,express可以快速創(chuàng)建一個(gè)應(yīng)用的骨架。
通過(guò)Express應(yīng)用生成器創(chuàng)建應(yīng)用只是眾多方法中的一種,你可以根據(jù)自己的需求修改它。

# 安裝
$ npm install express-generator -g

# 列出所有可用命令
$ express -h

# 初始化一個(gè)express項(xiàng)目
$ express myapp
$ cd myapp

# 然后安裝所有依賴包
$ npm install

# 啟動(dòng)此應(yīng)用
$ npm start

http://localhost:3000/

2.路由(Routing)

路由是指如何定義應(yīng)用的端點(diǎn)(URIs)以及如何響應(yīng)客戶端的請(qǐng)求。
路由(Routing)是由URI(路徑)和一個(gè)特定的HTTP方法(get、post、put、delete等)組成的,涉及到應(yīng)用如何響應(yīng)客戶端對(duì)某個(gè)網(wǎng)站節(jié)點(diǎn)的訪問(wèn)。

結(jié)構(gòu)

路由的定義由以下結(jié)構(gòu)組成:

  • app是一個(gè)express實(shí)例
  • method是某個(gè)HTTP請(qǐng)求方式中的一個(gè),Express定義了如下和HTTP請(qǐng)求對(duì)應(yīng)的路由方法:get, post, put, head, delete, options, tracem copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscirbe, unsubscirbe, patch, search, connect。有一些路由方法名并不是符合規(guī)范的javaScript變量名,此時(shí)用括號(hào)記法,比如:app['m-search'('/', function ...)
  • path是服務(wù)端的路徑
  • handler每一個(gè)路由都可以有一個(gè)或者多個(gè)處理器函數(shù),當(dāng)匹配到路由時(shí),這些函數(shù)將被執(zhí)行。
app.method(path, [handler...], handler)
// respond with"hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
  res.send('hello World!');
});

app.all()是一個(gè)特殊的路由方法,沒(méi)有任何HTTP方法與其對(duì)應(yīng),它的作用是對(duì)于一個(gè)路徑上所有請(qǐng)求加載中間件。在下面的例子中,來(lái)自/secret的請(qǐng)求,不管使用GET、POST或者其他任何HTTP請(qǐng)求,句柄都會(huì)得到執(zhí)行。

app.all('/secret', function(req, res, next) {
  res.send('GET request to the secret section');
  console.log('Accessing the secret section ...');
  next(); // pass control to the next handler
});
路由路徑path

路由路徑和請(qǐng)求方法一起定義了請(qǐng)求的端點(diǎn),它可以是字符串,字符串模式或者正則表達(dá)式。
使用字符串的路由路徑示例:

// 匹配根路徑的請(qǐng)求
app.get('/', function(req, res) {
  res.send('root');
});

// 匹配/about路徑的請(qǐng)求
app.get('/about', function(req, res) {
  res.send('about');
});

// 匹配/random.text路徑的請(qǐng)求 
app.get('/random.text', function(req, res) {
  res.send('random.text');
});

使用字符串模式的路由路徑示例:

// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});

// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
  res.send('ab+cd');
});

// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
  res.send('ab*cd');
});

使用正則表達(dá)式的路由路徑示例:

// 匹配任何路徑中含有a的路徑:
app.get(/a/, function(req, res) {
  res.send('/a/');
});

// 匹配butterfly、dragonfly,不匹配bufferflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
  res.send('/.*fly$/');
});
路由句柄handler

注意:Can't set headlers after they are sent
可以為請(qǐng)求提供多個(gè)回調(diào)函數(shù),其行為類似于中間件。唯一的區(qū)別是這些回調(diào)函數(shù)有可能調(diào)用next('route')方法而略過(guò)其他路由回調(diào)函數(shù),可以利用該機(jī)制為路由定義前提條件,如果在現(xiàn)有路徑上繼續(xù)執(zhí)行沒(méi)有意義,則可以將控制權(quán)交給剩下的路徑、
路由句柄有多種形式,可以是一個(gè)函數(shù),一個(gè)函數(shù)數(shù)組,或者兩者混合,如下所示:
使用一個(gè)回調(diào)函數(shù)處理路由:

app.get('/example/a', function(req, res) {
  res.send('Hello from A!');
});

使用多個(gè)回調(diào)函數(shù)處理路由(記得指定該next對(duì)象):

app.get('/example/b', function(req, res, next) {
  console.log('response will be sent by the next function ...');
  next();
}, function(req, res) {
  res.send('Hello from B!');
});

使用回調(diào)函數(shù)數(shù)組處理路由:

var cb0 = function(req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function(req, res, next) {
  console.log('CB1');
  next();
}

var cb2 = function(req, res) {
  res.send('Hello from C!');
}

app.get('example/c', [cb0, cb1, cb2]);

混合函數(shù)和函數(shù)數(shù)組處理路由:

var cb0 = function(req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function(req, res, next) {
  console.log('CB1');
  next();
}

app.get('/example/d', [cb0, cb1], function(req, res, next) {
  console.log('reponse will be sent by the next function...');
  next();
}, function() {
  res.send('Hello from D!');
});
響應(yīng)方法 res

下表響應(yīng)對(duì)象(res)的方法向客戶端返回響應(yīng),終結(jié)請(qǐng)求相應(yīng)的循環(huán)。如果在路由句柄中一個(gè)方法也不調(diào)用,來(lái)自客戶端的請(qǐng)求會(huì)一直掛起。
res.down() 提示下載文件
res.end() 終結(jié)響應(yīng)處理流程
res.json() 發(fā)送一個(gè)JSON格式的響應(yīng)
res.jsonp() 發(fā)送一個(gè)支持JSONP的JSON格式響應(yīng)
res.redirect() 重定向請(qǐng)求
res.render() 渲染視圖模板
res.send() 發(fā)送各種類型的響應(yīng)
res.sendFile() 以八位字節(jié)流的形式發(fā)送文件
res.sentStatus() 設(shè)置響應(yīng)狀態(tài)代碼,并將其以字符串形式作為響應(yīng)體的一部分發(fā)送。

app.route()

可使用app.route()創(chuàng)建路由路徑的鏈?zhǔn)铰酚删浔?。由于路徑在一個(gè)地方制定,這樣做有助于創(chuàng)建模塊化的路由,且減少了代碼冗余和拼寫錯(cuò)誤。

app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });
express.Router

可使用express.Router類創(chuàng)建模塊化,可掛載的路由句柄。
下面的實(shí)例程序創(chuàng)建了一個(gè)路由模塊,并加載了一個(gè)中間件,定義了一些路由,并且將它們掛載在至應(yīng)用的路徑上,在app目錄下創(chuàng)建名為bird.js的文件,內(nèi)容如下:

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

//  該路由使用的中間件
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
//  定義網(wǎng)站主頁(yè)的路由
router.get('/', function(req, res) {
  res.send('Birds home page');
});
//  定義about頁(yè)面的路由
router.get('/about', function(req, res) {
  res.send('About Birds');
});

module.exports = router;

然后在應(yīng)用中加載路由模塊,應(yīng)用即可處理發(fā)自/birds和birds/about的請(qǐng)求,并且調(diào)用為路由制定的timeLog中間件。

var birds = require('./birds');
...
app.use('/birds', birds);
3.中間件(Middleware)

Express是一個(gè)子很功能極簡(jiǎn),完全是路由和中間件構(gòu)成的一個(gè)web開(kāi)發(fā)框架:從本質(zhì)上來(lái)說(shuō),一個(gè)Express應(yīng)用就是在調(diào)用各種中間件。
中間件(Middleware)是一個(gè)函數(shù),它可以訪問(wèn)請(qǐng)求對(duì)象(req),響應(yīng)對(duì)象(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)用堆棧中的下一個(gè)中間件。
    注意:如果當(dāng)前中間件沒(méi)有終結(jié)請(qǐng)求-響應(yīng)循環(huán),則必須調(diào)用next()方法將控制器交給下一個(gè)中間件,否則請(qǐng)求就會(huì)掛起。
app.use
app.use([path], function)

Use the given middleware function, with optional mount path, defaulting to "/".
一個(gè)中間件處理器,請(qǐng)求來(lái)了,讓那些中間件先處理一遍

  • 沒(méi)有掛載路徑的中間件,應(yīng)用的每個(gè)請(qǐng)求都會(huì)執(zhí)行該中間件。
  • 掛在至/path的中間件,任何指向/path的請(qǐng)求都會(huì)執(zhí)行它。

中間件分類

Express應(yīng)用可使用如下幾種中間件:

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

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

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');
});

// 一個(gè)中間件棧,對(duì)任何指向/user/:id的HTTP請(qǐng)求打印出相關(guān)信息
app.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();
});
2.路由級(jí)中間件

路由級(jí)中間件和應(yīng)用級(jí)中間件一樣,只是它綁定的對(duì)象為express.Router()。路由級(jí)使用router.use()或router.VERB()加載。
上述應(yīng)用級(jí)中間件系統(tǒng),可以通過(guò)如下代碼寫為路由級(jí):

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.originUrl);
  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);
3.錯(cuò)誤處理中間件

錯(cuò)誤處理中間件與其他中間件定義類似,只是必須使用4個(gè)參數(shù)(err, req, res, next),即時(shí)不需要next對(duì)象,也必須在簽名中聲明它,否則中間件將會(huì)被識(shí)別為一個(gè)常規(guī)中間件,不能處理錯(cuò)誤。
錯(cuò)誤處理中間件應(yīng)當(dāng)在其他app.use()和路由調(diào)用之后才能加載,比如:

var bodyParser = require('body-Parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(function(err, req, res, next) {
  //  業(yè)務(wù)邏輯
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

中間件返回的響應(yīng)是隨意的,可以響應(yīng)一個(gè)HTML錯(cuò)誤頁(yè)面,依據(jù)簡(jiǎn)單的話,一個(gè)JSON字符串,或者其他任何您想要的東西。
為了便于組織(更高級(jí)的框架),您可能會(huì)像定義常規(guī)中間件一樣,定義多個(gè)錯(cuò)誤處理中間件,比如您想為使用XHR的請(qǐng)求定義一個(gè),還想為沒(méi)有使用的定義一個(gè),那么:

var bodyParser = require('body-parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(logErrors);
app.use(clientErrorHandler); 
app.use(errorHandler);

// logErrors將請(qǐng)求和錯(cuò)誤信息寫入標(biāo)準(zhǔn)錯(cuò)誤輸出、日志或類似服務(wù):
function logErrors(err, req, res, next) {
  console.log(err.stack);
  next(err);
}

//  clientErrorHandler的定義如下(注意這里將錯(cuò)誤直接傳給了next)
function clientErrorHandler(err, req, res, next) {
  if(req.xhr) {
    res.status(500).send({ error: 'Something blew up!'});
  } else {
    next(err);
  }
}

//  errorHandler能捕獲所有錯(cuò)誤,其定義如下:
function errorHandler(err, req, res, next) {
  res.status(500);
  res.render('error', {error: err});
}
4.內(nèi)置中間件

Express以前內(nèi)置的中間件現(xiàn)在已經(jīng)全部單獨(dú)作為模塊安裝使用了。
express.static是Express唯一內(nèi)置的中間件,它基于serve-static,負(fù)責(zé)在Express應(yīng)用中提供托管靜態(tài)資源的服務(wù)。

5.第三方中間件

下面的例子安裝并加載了一個(gè)解析cookie的中間件:cookie-parser

$ npm install cookie-parser
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');

//  加載用于解析cookie的中間件
app.use(cookieParser());

4.托管靜態(tài)文件

通過(guò)Express內(nèi)置的express.static可以方便的托管靜態(tài)文件,例如:圖片、CSS、JavaScript文件等。將靜態(tài)資源文件所在的目錄作為參數(shù)傳遞給express.static,中間件就可以提供靜態(tài)資源文件的訪問(wèn)了。

使用

所有文件的路徑都是相對(duì)于存放目錄的,因此,存放靜態(tài)文件的目錄名不會(huì)出現(xiàn)在URL中。
假設(shè)在public目錄放置了圖片、CSS和JavaScript文件,你就可以:

app.use(express,static('public'));

現(xiàn)在,public目錄下的文件就可以訪問(wèn)了。

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

如果你希望通過(guò)express.static訪問(wèn)的文件都存放在一個(gè)虛擬目錄中(即目錄根本不存在),可以通過(guò)為靜態(tài)資源目錄指定一個(gè)掛載路徑的方式來(lái)實(shí)現(xiàn),如下所示:

app.use('/static', express.static('public'));

現(xiàn)在,你就可以通過(guò)帶有/static前綴的地址來(lái)訪問(wèn)public目錄下面的文件了。

path.join()

注意:Arguments to the path join must be strings
將多個(gè)參數(shù)組合成一個(gè)path,語(yǔ)法:

path.join([path1], [path2], [...]);

由于該方法屬于path模塊,使用前需要引入path模塊

const express = require('express');
const path = require('path');

var app = express();

app.set('views', path.join(__dirname, 'views'));

app.use(express.static(path.join(__dirname. 'public')));

5.Express中使用模板引擎

安裝相應(yīng)的模板引擎npm軟件包,不需要在頁(yè)面require('pug');

$ npm install pug --save

編寫模板文件

html
  head
    title != title
  body
    h1 != message

然后創(chuàng)建一個(gè)路由,來(lái)渲染模板文件,模板文件會(huì)被渲染為HTML。如果沒(méi)有設(shè)置view enginine,您需要指明視圖文件的后綴,否則就會(huì)遺漏它。

  • views 存放模板文件的目錄
  • view.engine 注冊(cè)模板引擎
const express = require('express');

let app = express();

// view engine setup
app,set('views', ['./v']);
app,set('view engine', 'pug');

//  http://localhost:3000/index
app.get('/index', function(req, res) {
  res.render('index', {
    title: 'Hey',
    message: 'view engine, Hello there!'
  });
});

//  首頁(yè)路由
app.get('/', function(req, res) {
  res.send('index routing, hello world');
});

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

  console.log(`app listening at port: ${port}`);
});

6.Express 4遷移

Express 4是對(duì)Express 3的一個(gè)顛覆性改變,也就是說(shuō)如果您更新了Express,Express 3應(yīng)用會(huì)無(wú)法工作。

1.對(duì)Express內(nèi)核和中間件系統(tǒng)的改進(jìn)
Express 3 Express 4
express.bodyParser body-parser + multer
express.comress compression
express.cookieSession cookie.session
express.cookieParser cookie.parser
express.logger morgan
express.session express-session
express.favicon serve-favicon
express.responseTime reponse-time
express.errorHandler errorhandler
express.methodOverride method-override
express.timeout connect-timeout
express.vhost vhost
express.csrf csurf
express.directory serve-index
express.static serve-static

Express 4不再依賴Connect,而且從內(nèi)核中移除了除express.static外的所有內(nèi)置中間件。
也就是說(shuō)現(xiàn)在的Express是一個(gè)獨(dú)立的路由和中間件Web框架,Express的版本升級(jí)不再受中間件更新的影響。
移除了內(nèi)置的中間件后,您必須顯式地添加所有運(yùn)行應(yīng)用需要的中間件,請(qǐng)遵循如下步驟:
1.安裝模塊:
2.在應(yīng)用中引入模塊:
3.按照文檔的描述使用模塊:
下表列出了Express 3和Express 4對(duì)應(yīng)的中間件:

Express 3 Express 4
express.bodyParser body-parser + multer
express.comress compression
express.cookieSession cookie.session
express.cookieParser cookie.parser
express.logger morgan
express.session express-session
express.favicon serve-favicon
express.responseTime reponse-time
express.errorHandler errorhandler
express.methodOverride method-override
express.timeout connect-timeout
express.vhost vhost
express.csrf csurf
express.directory serve-index
express.static serve-static
2.路由系統(tǒng)

應(yīng)用現(xiàn)在隱式加載路由中間件,因此不需要擔(dān)心涉及到router中間件對(duì)路由中間件加載順序的問(wèn)題了。
定義路由的方式依然未變,但是新的路由系統(tǒng)有兩個(gè)新功能幫助您組織路由:

  • 添加了一個(gè)新類:express.Router,可以創(chuàng)建可掛載的模塊化路由句柄。
    +添加了一個(gè)新方法:app.route(),可以為路由路徑創(chuàng)建鏈?zhǔn)铰酚删浔?/li>
3.其他變化
對(duì)象 描述
Node >Express 4需要Node 0.10.x或以上版本,已經(jīng)放棄了對(duì)Node 0.8.x的支持。
http.createServer() http模塊不再是必須的了,除非您需要直接使用它(socket.io/SPDY/HTTPS),現(xiàn)在可以使用app.listen()啟動(dòng)應(yīng)用了。
app.configure() 已經(jīng)刪除app.configure(),使用process.env.NODE_ENV或者app.get('env')檢測(cè)環(huán)境并配置應(yīng)用
json spaces Expresss 4默認(rèn)禁用 json spaces屬性
req.accepted() 使用req.accepts(),req.acceptsEncoding(), req.acceptsCharsets()和req.acceptsLanguages()
res.location() 不再解析相對(duì)URLs
res.params 此函數(shù)變?yōu)閷?duì)象
res.locals 此函數(shù)變?yōu)閷?duì)象
res.headerSent 變?yōu)閞es.headersSent
app.route() 變?yōu)閍pp.mountpath
res.on('header') 已刪除
res.charset 已刪除
res.setHeader('Set-Cookie', val) F功能僅限于設(shè)置基本的cookie值,使用res.cookie()訪問(wèn)更多功能。

運(yùn)行:

node .
遷移

卸載Express 3 應(yīng)用生成器:

$ npm uninstall -g express

然后安裝新的生成器:

$ npm install -g express-generator
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容