目錄
Node.js 是一個(gè)基于Google Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全球最大的開(kāi)源庫(kù)生態(tài)系統(tǒng)。
能方便地搭建響應(yīng)速度快、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用,Node.js 使用事件驅(qū)動(dòng), 非阻塞I/O 模型而得以輕量和高效,非常適合在分布式設(shè)備上運(yùn)行的數(shù)據(jù)密集型的實(shí)時(shí)應(yīng)用。
官網(wǎng):https://nodejs.org/en/
中文:https://cnodejs.org/ 、http://nodejs.cn/
API:http://nodeapi.ucdok.com/#/api/
簡(jiǎn)單說(shuō)Node.js就是運(yùn)行在服務(wù)器端的JavaScript,是現(xiàn)在流行的語(yǔ)言中能同時(shí)運(yùn)行在前端與后臺(tái)的程序語(yǔ)言,你可以把JavaScript想像成Java與C#。相關(guān)技術(shù):
數(shù)據(jù)庫(kù):MongoDB,非關(guān)系型數(shù)據(jù)庫(kù),NoSQL(Not only SQL)
MVC框架:AngularJS
Web服務(wù)器:Express
模板引擎:jade、ejs、htmljs、swig、hogan.js
去官網(wǎng)下下載最新版本的Node.js一步一步按提示安裝即可,如果安裝失敗就手動(dòng)安裝,將Node.js的安裝位置配置到環(huán)境變量的path中。
安裝完成后啟動(dòng)命令行,測(cè)試:
如果不使用IDE開(kāi)發(fā)項(xiàng)目效率較低,在很多主流的集成開(kāi)發(fā)環(huán)境(IDE)中都可以安裝插件支持Node.js開(kāi)發(fā),如Eclipse,這里我們以HBuilder為例:
啟動(dòng)HBuilder->工具->插件安裝
安裝成功后就可以新建Node.js項(xiàng)目了:
這里選擇Hello World,新建好的項(xiàng)目如下:
hello-world-server.js文件就是一個(gè)簡(jiǎn)單的web服務(wù)器,右鍵選擇“運(yùn)行方式”->"Node Application"
控制臺(tái)提示“Server running at http://127.0.0.1:1337/”在瀏覽器查看的效果如下:
在上面的示例中,我們是通過(guò)IDE完成編譯與運(yùn)行的,其實(shí)手動(dòng)運(yùn)行也可以,比如編寫(xiě)一段代碼如下:
server.js
//依賴一個(gè)http模塊,相當(dāng)于java中的import,與C#中的usingvar http = require('http');//創(chuàng)建一個(gè)服務(wù)器對(duì)象server = http.createServer(function (req, res) {//設(shè)置請(qǐng)求成功時(shí)響應(yīng)頭部的MIME為純文本res.writeHeader(200, {"Content-Type": "text/plain"});//向客戶端輸出字符res.end("Hello World\n");});//讓服務(wù)器監(jiān)聽(tīng)本地8000端口開(kāi)始運(yùn)行server.listen(8000,'127.0.0.1');console.log("server is runing at 127.0.0.1:8000");
在node環(huán)境下解釋運(yùn)行:
運(yùn)行結(jié)果:
引入 required 模塊:我們可以使用 require 指令來(lái)載入 Node.js 模塊。
創(chuàng)建服務(wù)器:服務(wù)器可以監(jiān)聽(tīng)客戶端的請(qǐng)求,類(lèi)似于TomCat、IIS、Apache 、Nginx 等 HTTP 服務(wù)器。
接收請(qǐng)求與響應(yīng)請(qǐng)求 服務(wù)器很容易創(chuàng)建,客戶端可以使用瀏覽器或終端發(fā)送 HTTP 請(qǐng)求,服務(wù)器接收請(qǐng)求后返回響應(yīng)數(shù)據(jù)。
第一行請(qǐng)求(require)Node.js 自帶的 http 模塊,并且把它賦值給 http 變量。
接下來(lái)我們調(diào)用 http 模塊提供的函數(shù): createServer 。這個(gè)函數(shù)會(huì)返回 一個(gè)對(duì)象,這個(gè)對(duì)象有一個(gè)叫做 listen 的方法,這個(gè)方法有一個(gè)數(shù)值參數(shù), 指定這個(gè) HTTP 服務(wù)器監(jiān)聽(tīng)的端口號(hào)。
NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問(wèn)題,常見(jiàn)的使用場(chǎng)景有以下幾種:
a)、允許用戶從NPM服務(wù)器下載別人編寫(xiě)的第三方包到本地使用。
b)、允許用戶從NPM服務(wù)器下載并安裝別人編寫(xiě)的命令行程序到本地使用。
c)、允許用戶將自己編寫(xiě)的包或命令行程序上傳到NPM服務(wù)器供別人使用。
官網(wǎng):https://www.npmjs.com/
4.1、查看npm版本
由于新版的nodejs已經(jīng)集成了npm,所以之前npm也一并安裝好了。同樣可以通過(guò)輸入 "npm -v" 來(lái)測(cè)試是否成功安裝。命令如下,出現(xiàn)版本提示表示安裝成功:
4.2、升級(jí)npm
如果你安裝的是舊版本的 npm,可以很容易得通過(guò) npm 命令來(lái)升級(jí)
npm install npm -g
npm install <Module Name> -參數(shù)
如果帶參數(shù)-g表示全局安裝,否則只是安裝到某個(gè)目錄下。
以下實(shí)例,我們使用 npm 命令安裝常用的 Node.js web框架模塊 express
我們可以使用以下命令來(lái)卸載 Node.js 模塊。
npm uninstall <Module Name>
如先使用安裝指令安裝bootstrap:
npm install bootstrap
再使用卸載指令刪除模塊:
npm uninstall bootstrap
可以到 /node_modules/ 目錄下查看包是否還存在
使用模塊列表命令可以方便的看到當(dāng)前項(xiàng)目中依賴的包:
npm ls
我們可以使用以下命令更新模塊:
npm update 模塊名稱(chēng)
npm up -g 模塊名稱(chēng)
npm search 模塊名稱(chēng)
4.8、NPM 常用命令
除了本章介紹的部分外,NPM還提供了很多功能,package.json里也有很多其它有用的字段。
除了可以在npmjs.org/doc/查看官方文檔外,這里再介紹一些NPM常用命令。
NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
使用npm help <command>可查看某條命令的詳細(xì)幫助,例如npm help install。
在package.json所在目錄下使用npm install . -g可先在本地安裝當(dāng)前命令行程序,可用于發(fā)布前的本地測(cè)試。
使用npm update <package>可以把當(dāng)前目錄下node_modules子目錄里邊的對(duì)應(yīng)模塊更新至最新版本。
使用npm update <package> -g可以把全局安裝的對(duì)應(yīng)命令行程序更新至最新版。
使用npm cache clear可以清空NPM本地緩存,用于對(duì)付使用相同版本號(hào)發(fā)布新版本代碼的人。
使用npm unpublish <package>@<version>可以撤銷(xiāo)發(fā)布自己發(fā)布過(guò)的某個(gè)版本代碼。
因?yàn)閚pm的服務(wù)器在國(guó)外,在網(wǎng)絡(luò)狀態(tài)不好的情況下引入一個(gè)模塊會(huì)因?yàn)榫W(wǎng)絡(luò)延遲而失敗,可以更換成國(guó)內(nèi)速度更快的鏡像服務(wù)器,這里以使用淘寶 NPM 鏡像(http://npm.taobao.org/)為例:
npm install -g cnpm --registry=https://registry.npm.taobao.org
這樣就可以使用 cnpm 命令來(lái)安裝模塊了:
$ cnpm install [name]
這是一個(gè)完整 npmjs.org 鏡像,你可以用此代替官方版本(只讀),同步頻率目前為 10分鐘 一次以保證盡量與官方服務(wù)同步。
Express 是一個(gè)簡(jiǎn)潔而靈活的 node.js Web應(yīng)用框架, 提供了一系列強(qiáng)大特性幫助你創(chuàng)建各種 Web 應(yīng)用,和豐富的 HTTP 工具。
使用 Express 可以快速地搭建一個(gè)完整功能的網(wǎng)站。使用Node.js作為AngularJS開(kāi)發(fā)Web服務(wù)器的最佳方式是使用Express模塊。
Express官網(wǎng): http://expressjs.com/
Express4.x API:http://expressjs.com/zh-cn/4x/api.html
可以設(shè)置中間件來(lái)響應(yīng) HTTP 請(qǐng)求。
定義了路由表用于執(zhí)行不同的 HTTP 請(qǐng)求動(dòng)作。
可以通過(guò)向模板傳遞參數(shù)來(lái)動(dòng)態(tài)渲染 HTML 頁(yè)面。
豐富的 HTTP 快捷方法和任意排列組合的 Connect 中間件,讓你創(chuàng)建健壯、友好的 API 變得既快速又簡(jiǎn)單。
Express 不對(duì) Node.js 已有的特性進(jìn)行二次抽象,我們只是在它之上擴(kuò)展了 Web 應(yīng)用所需的基本功能。
安裝 Express 并將其保存到依賴列表中:
npm install express --save
以上命令全局安裝express。也可安裝時(shí)指定安裝中間件。
body-parser - node.js 中間件,用于處理 JSON, Raw, Text 和 URL 編碼的數(shù)據(jù)。
cookie-parser - 這就是一個(gè)解析Cookie的工具。通過(guò)req.cookies可以取到傳過(guò)來(lái)的cookie,并把它們轉(zhuǎn)成對(duì)象。
multer - node.js 中間件,用于處理 enctype="multipart/form-data"(設(shè)置表單的MIME編碼)的表單數(shù)據(jù)。
npm install cookie-parser --save
$ npm install multer --save
默認(rèn)這些模塊都已經(jīng)添加。
接下來(lái)我們使用 Express 框架來(lái)輸出 "Hello World"。
以下實(shí)例中我們引入了 express 模塊,并在客戶端發(fā)起請(qǐng)求后,響應(yīng) "Hello World" 字符串。
創(chuàng)建一個(gè)目錄,如Project,進(jìn)入命令行:
使用npm install express 導(dǎo)入express模塊。
在目錄下創(chuàng)建hello.js文件,如下所示:
//引入express模塊var express = require('express');//創(chuàng)建一個(gè)app對(duì)象,類(lèi)似一個(gè)web 應(yīng)用(網(wǎng)站)var app = express();//接受指定路徑的請(qǐng)求,指定回調(diào)函數(shù)app.get('/', function (req, res){res.send('Hello World');});//創(chuàng)建一個(gè)web服務(wù)器,可以認(rèn)為就是web服務(wù)器對(duì)象//監(jiān)聽(tīng)8081端口,當(dāng)監(jiān)聽(tīng)成功時(shí)回調(diào)var server = app.listen(8081, function () { var host = server.address().address; //地址 var port = server.address().port; //端口 console.log("應(yīng)用實(shí)例,訪問(wèn)地址為 http://%s:%s", host, port);});})
使用node執(zhí)行js:
運(yùn)行結(jié)果:
如果直接使用記事本效率會(huì)不高,nodeclipse插件可以方便的創(chuàng)建一個(gè)Express項(xiàng)目,步驟如下:
創(chuàng)建好的項(xiàng)目如下:
app.js是網(wǎng)站:
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 index = require('./routes/index');var users = require('./routes/users');var app = express();//指定視圖引擎為ejsapp.set('views', path.join(__dirname, 'views'));app.set('view engine', 'ejs');// uncomment after placing your favicon in /public//app.use(favicon(path.join(__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('/', index);app.use('/users', users);// catch 404 and forward to error handlerapp.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err);});// error handlerapp.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error');});module.exports = app;
bin\www是web服務(wù)器:
#!/usr/bin/env node/** * 依賴模塊,導(dǎo)入 */var app = require('../app');var debug = require('debug')('nodejsexpress:server');var http = require('http');/** * 從上下文環(huán)境中獲得監(jiān)聽(tīng)端口,如果空則3000 */var port = normalizePort(process.env.PORT || '3000');app.set('port', port);/** * 創(chuàng)建Web服務(wù)器 */var server = http.createServer(app);/** * 開(kāi)始監(jiān)聽(tīng) */server.listen(port);server.on('error', onError); //指定發(fā)生錯(cuò)誤時(shí)的事件server.on('listening', onListening); //當(dāng)監(jiān)聽(tīng)成功時(shí)的回調(diào)/** * 規(guī)范化端口 */function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false;}/** *錯(cuò)誤事件監(jiān)聽(tīng) */function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; //錯(cuò)誤處理 switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); //結(jié)束程序 break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; }}/** * 當(dāng)用戶訪問(wèn)服務(wù)器成功時(shí)的回調(diào) */function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind);}
routers/index.js路由,有點(diǎn)類(lèi)似控制器或Servlet:
var express = require('express');var router = express.Router();/* 獲得首頁(yè) */router.get('/', function(req, res, next) { res.render('index', { title: 'Express' });});module.exports = router;
views/index.ejs首頁(yè)視圖:
<!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>
在www上右鍵選擇“運(yùn)行方式”->“Node Application”運(yùn)行結(jié)果:
ejs是一個(gè)Express Web應(yīng)用的模板引擎,在NodeJS開(kāi)發(fā)中可以選擇的模板引擎可能是所有Web應(yīng)用開(kāi)發(fā)中范圍最廣的,如jade、ejs、htmljs、swig、hogan.js,但ejs是最容易上手的,與jsp,asp,php的原始模板引擎風(fēng)格很像。
官網(wǎng):http://www.embeddedjs.com/
添加一個(gè)product.js路由:
var express = require('express');var router = express.Router();/* 產(chǎn)品 */router.get('/', function(req, res, next) { var products=[]; products.push({name:"ZTE U880",price:899.8}); products.push({name:"HuWei 榮耀8",price:1899.8}); products.push({name:"iPhone 7 Plus 128G",price:5899.8}); //將product視圖與指定的對(duì)象渲染后輸出到客戶端 res.render('product', { title: '天狗商城', pdts:products});});module.exports = router;
在views目錄下添加product.ejs視圖,這里是一個(gè)簡(jiǎn)單的MVC:
<!DOCTYPE html><html> <head> <title> <%= title %> </title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <h1><%= title %> - 產(chǎn)品列表</h1> <table border="1" width="80%"> <tr> <th>序號(hào)</th> <th>名稱(chēng)</th> <th>價(jià)格</th> </tr> <%pdts.forEach(function(pdt,index){%> <tr> <td> <%=index+1%> </td> <td> <%=pdt.name%> </td> <td> <%=pdt.price%> </td> </tr> <%});%> </table> <ul> <% for(var i=0; i<pdts.length; i++) {%> <li> <%=pdts[i].name%> </li> <% } %> </body></html>
修改app,注冊(cè)定義好的模塊product:
var index = require('./routes/index');var users = require('./routes/users');var pdts = require('./routes/product');var app = express();//指定視圖引擎為ejsapp.set('views', path.join(__dirname, 'views'));app.set('view engine', 'ejs');// uncomment after placing your favicon in /public//app.use(favicon(path.join(__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('/', index);app.use('/users', users);app.use('/pdt', pdts);
運(yùn)行結(jié)果:
這是一個(gè)具有一致接口、模塊化、高性能等特性的 JavaScript 工具庫(kù)??梢苑浅7奖愕牟僮鱦son。
官網(wǎng):http://lodashjs.com/
安裝:
npm i -g npm
npm i --save lodash
安裝時(shí)先用cd切換到當(dāng)前項(xiàng)目下。
如果瀏覽器使用可以直接引入:
<script src="lodash.js"></script>
后臺(tái)Node.js使用,可以引入模塊:
//導(dǎo)入lodash模塊var _= require('lodash');var products=[];products.push({name:"ZTE U880",price:899.8});products.push({name:"HuWei 榮耀8",price:1899.8});products.push({name:"iPhone 7 Plus 128G",price:5899.8});//1、取出第一個(gè)元素var obj1=_.first(products);console.log(obj1.name); //ZTE U880//2、取出最后一個(gè)元素var obj2=_.last(products);console.log(obj2.name); //iPhone 7 Plus 128G//3、指定查找條件返回符合條件的索引var obj3=_.findIndex(products,function(obj){ return obj.price>=1000&&obj.name.indexOf("7")>0;});console.log(obj3); //2//4、指定查找條件返回查找到的對(duì)象var obj4=_.find(products,function(obj){ return obj.price>=1000&&obj.name.indexOf("7")>0;});console.log(obj4); //{ name: 'iPhone 7 Plus 128G', price: 5899.8 }//5、排序var obj5=_.orderBy(products,["price","name"],["desc","asc"]);console.log(obj5); //[ { name: 'iPhone 7 Plus 128G', price: 5899.8 },//{ name: 'HuWei 榮耀8', price: 1899.8 },//{ name: 'ZTE U880', price: 899.8 } ]//6、查找價(jià)格為1899.8的產(chǎn)品的keyvar obj6=_.findKey(products,{price:1899.8});console.log(obj6); //1
API的使用非常簡(jiǎn)單,但需要注意版本,可以現(xiàn)查現(xiàn)用,API地址:https://lodash.com/docs/4.17.2
Checks route params (req.params), ex: /user/:id
127.0.0.1:3000/index,這種情況下,我們?yōu)榱说玫絠ndex,我們可以通過(guò)使用req.params得到,通過(guò)這種方法我們就可以很好的處理Node中的路由處理問(wèn)題,同時(shí)利用這點(diǎn)可以非常方便的實(shí)現(xiàn)MVC模式;
//獲得產(chǎn)品根據(jù)Idrouter.get('/:id/:category',function(request,res,next){ res.send(request.params.id+","+request.params.category);});
運(yùn)行結(jié)果:
Checks query string params (req.query), ex: ?id=12
127.0.0.1:3000/index?id=12,這種情況下,這種方式是獲取客戶端get方式傳遞過(guò)來(lái)的值,通過(guò)使用req.query.id就可以獲得,類(lèi)似于PHP的get方法;
router.get('/:id',function(request,res,next){ res.send("name:"+request.query.name);});
運(yùn)行結(jié)果:
在post請(qǐng)求中獲得表單中的數(shù)據(jù)。
Checks urlencoded body params (req.body), ex: id=
127.0.0.1:300/index,然后post了一個(gè)id=2的值,這種方式是獲取客戶端post過(guò)來(lái)的數(shù)據(jù),可以通過(guò)req.body.id獲取,類(lèi)似于PHP的post方法;
頁(yè)面:
代碼:
router.post('/add',function(request,res,next){ var entity={name:request.body.name,price:request.body.price}; products.push(entity); //將product視圖與指定的對(duì)象渲染后輸出到客戶端 res.render('product', { title: '天狗商城', pdts:products,msg:"添加成功"});});
結(jié)果:
如果需要Node.js向外提供返回JSON的接口,Express也是非常方便的,可以使用原來(lái)在瀏覽器中使用到的JSON對(duì)象,這是一個(gè)瀏覽器內(nèi)置對(duì)象在服務(wù)可以直接使用:
將對(duì)象序列化成字符:
//對(duì)象 var rose={"name":"Rose","weight":"65"}; //序列化成字符串 var str=JSON.stringify(rose); alert(str);
結(jié)果:
反序列化,將字符轉(zhuǎn)換成對(duì)象:
//將字符串轉(zhuǎn)換成JavaScript對(duì)象 var markStr='{"name":"mark","weight":"188"}'; var mark=JSON.parse(markStr); alert(mark.name+","+mark.weight);
結(jié)果:
Express已經(jīng)封裝了一個(gè)json方法,直接調(diào)用該方法就可以序列化對(duì)象:
/* 產(chǎn)品 */router.get('/rest', function(req, res, next) { res.json(products);});
運(yùn)行結(jié)果:
練習(xí):完成一個(gè)圖書(shū)管理的功能,圖書(shū)包含(編號(hào),名稱(chēng),作者,圖片,價(jià)格),實(shí)現(xiàn):
a)、非AJAX的CRUD,使用Node.js+Express+ejs的動(dòng)態(tài)技術(shù)。
b)、AJAX的CRUD,使用Node.js+Express+jQuery+HTML技術(shù)實(shí)現(xiàn)。
c)、使用RestFul風(fēng)格的服務(wù)完成第個(gè)作業(yè),get,post,delete,put請(qǐng)。
REST是英文Representational State Transfer的縮寫(xiě),中文稱(chēng)之為“表述性狀態(tài)轉(zhuǎn)移”
基于HTTP協(xié)議
是另一種服務(wù)架構(gòu)
傳遞是JSON、POX(Plain Old XML)而不是SOAP格式的數(shù)據(jù)
充分利用HTTP謂詞(Verb)
側(cè)重?cái)?shù)據(jù)的傳輸,業(yè)務(wù)邏輯交給客戶端自行處理
REST是一種分布式服務(wù)架構(gòu)的風(fēng)格約束,像Java、.Net(WCF、WebAPI)都有對(duì)該約束的實(shí)現(xiàn),使URL變得更加有意義,更加簡(jiǎn)潔明了,如:
http://www.zhangguo.com/products/1 get請(qǐng)求 表示獲得所有產(chǎn)品的第1個(gè)
http://www.zhangguo.com/products/product post請(qǐng)求 表示添加一個(gè)產(chǎn)品
http://www.zhangguo.com/products/1/price get請(qǐng)求 表示獲得第1個(gè)產(chǎn)品的價(jià)格
http://www.zhangguo.com/products/1 delete請(qǐng)求 刪除編號(hào)為1的產(chǎn)品
REST設(shè)計(jì)需要遵循的原則
網(wǎng)絡(luò)上的所有事物都被抽象為資源(resource);
每個(gè)資源對(duì)應(yīng)一個(gè)唯一的資源標(biāo)識(shí)符(resource identifier);
通過(guò)通用的連接器接口(generic connector interface)對(duì)資源進(jìn)行操作;
對(duì)資源的各種操作不會(huì)改變資源標(biāo)識(shí)符;
所有的操作都是無(wú)狀態(tài)的(stateless)
謂詞
GET
表示查詢操作,相當(dāng)于Retrieve、Select操作
POST
表示插入操作,相當(dāng)于Create,Insert操作
PUT
表示修改操作,相當(dāng)于Update操作
DELETE
表示刪除操作,相當(dāng)于Delete操作
其它還有:
NodeJS+Express可以很容易的實(shí)現(xiàn)REST
application/x-www-form-urlencoded
multipart/form-data
application/json
res.setHeader('Content-Type', 'application/json;charset=utf-8');
示例代碼cars.js:
var express = require('express');var router = express.Router();var _= require('lodash');var cars=[];cars.push({id:201701,name:"BMW",price:190,speed:"210km/h",color:"白色"});cars.push({id:201702,name:"BYD",price:25,speed:"160km/h",color:"紅色"});cars.push({id:201703,name:"Benz",price:300,speed:"215km/h",color:"藍(lán)色"});cars.push({id:201704,name:"Honda",price:190,speed:"170km/h",color:"黑色"});cars.push({id:201705,name:"QQ",price:130,speed:"210km/h",color:"白色"});/* Get *//*獲得所有汽車(chē)*//*url /cars/*/router.get('/', function(req, res, next) { res.json(cars);});/*Get*//*獲得汽車(chē)通過(guò)id*//*url:/cars/:id */router.get('/:id', function(req, res, next) { //從路徑中映射參數(shù),轉(zhuǎn)換成數(shù)字 var id=parseInt(req.params.id); var car=_.find(cars,{id:id}); res.json(car);});/*Post*//*添加汽車(chē)*//*url:/cars/car */router.post('/car', function(req, res, next) { var car=req.body; //從請(qǐng)求正文中獲得json對(duì)象 car.id=_.last(cars).id+1; //將編號(hào)修改為最后一輛車(chē)的編號(hào)+1 cars.push(car); //將汽車(chē)對(duì)象添加到集合中 res.json(car); //將添加成功的車(chē)以json的形式返回});/*Put*//*修改汽車(chē)*//*url:/cars/car */router.put('/car', function(req, res, next) { var car=req.body; //從請(qǐng)求正文中獲得json對(duì)象 console.log(req.body); var index=_.findIndex(cars,{id:parseInt(car.id)}); //根據(jù)id獲得車(chē)在集合中的下標(biāo) cars[index]=car; //替換原對(duì)象 //res.json(car); //將修改后的車(chē)以json的形式返回 res.send({status:"success", message:"更新成功!"}); });/*Delete*//*刪除汽車(chē)*//*url:/cars/:id */router.delete('/id/:id', function(req, res, next) { //獲得url中的編號(hào)參數(shù) var id=parseInt(req.params.id); var index=_.findIndex(cars,{id:id}); //根據(jù)id獲得車(chē)在集合中的下標(biāo) cars.splice(index,1); //在cars數(shù)組中刪除下標(biāo)從index開(kāi)始的1條數(shù)據(jù) res.send({status:"success", message:"刪除成功!"}); });module.exports = router;
示例代碼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 index = require('./routes/index');var users = require('./routes/users');var pdts = require('./routes/product');var task = require('./routes/task');var cars = require('./routes/cars');var app = express();//指定視圖引擎為ejsapp.set('views', path.join(__dirname, 'views'));app.set('view engine', 'ejs');// uncomment after placing your favicon in /public//app.use(favicon(path.join(__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('/', index);app.use('/users', users);app.use('/pdt', pdts);app.use("/task",task);app.use("/cars",cars);// catch 404 and forward to error handlerapp.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err);});// error handlerapp.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error');});module.exports = app;
/* Get */
/*獲得所有汽車(chē)*/
/*url /cars/*/
/*Get*/
/*獲得汽車(chē)通過(guò)id*/
/*url:/cars/:id */
/*Post*/
/*添加汽車(chē)*/
/*url:/cars/car */
參數(shù)中的json格式一定要使用標(biāo)準(zhǔn)格式,注意引號(hào),注意Content-Type,默認(rèn)的Content-Type類(lèi)型是:application/x-www-form-urlencoded
/*Put*/
/*修改汽車(chē)*/
/*url:/cars/car */
/*Delete*/
/*刪除汽車(chē)*/
/*url:/cars/:id */
聯(lián)系客服