±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬½éÉÜÁ˴Node.js¿ª·¢»·¾³£¬µÚÒ»¸öNode.js³ÌÐò£¬NPM£¨Node.js°ü¹ÜÀíÆ÷£©£¬ExpressµÈ֪ʶ¡£ |
|
Ò»¡¢¼ò½é
Node.js ÊÇÒ»¸ö»ùÓÚGoogle Chrome V8 ÒýÇæµÄ JavaScript ÔËÐл·¾³¡£Node.js
ʹÓÃÁËÒ»¸öʼþÇý¶¯¡¢·Ç×èÈûʽ I/O µÄÄ£ÐÍ£¬Ê¹ÆäÇáÁ¿ÓÖ¸ßЧ¡£Node.js µÄ°ü¹ÜÀíÆ÷ npm£¬ÊÇÈ«Çò×î´óµÄ¿ªÔ´¿âÉú̬ϵͳ¡£

ÄÜ·½±ãµØ´î½¨ÏìÓ¦Ëٶȿ졢Ò×ÓÚÀ©Õ¹µÄÍøÂçÓ¦Óã¬Node.js ʹÓÃʼþÇý¶¯£¬ ·Ç×èÈûI/O Ä£ÐͶøµÃÒÔÇáÁ¿ºÍ¸ßЧ£¬·Ç³£ÊʺÏÔÚ·Ö²¼Ê½É豸ÉÏÔËÐеÄÊý¾ÝÃܼ¯Ð͵ÄʵʱӦÓá£
¹ÙÍø£ºhttps://nodejs.org/en/
ÖÐÎÄ£ºhttps://cnodejs.org/¡¢http://nodejs.cn/
API£ºhttp://nodeapi.ucdok.com/#/api/
¼òµ¥ËµNode.js¾ÍÊÇÔËÐÐÔÚ·þÎñÆ÷¶ËµÄJavaScript£¬ÊÇÏÖÔÚÁ÷ÐеÄÓïÑÔÖÐÄÜͬʱÔËÐÐÔÚǰ¶ËÓëºǫ́µÄ³ÌÐòÓïÑÔ£¬Äã¿ÉÒÔ°ÑJavaScriptÏëÏñ³ÉJavaÓëC#¡£Ïà¹Ø¼¼Êõ£º
Êý¾Ý¿â£ºMongoDB£¬·Ç¹ØÏµÐÍÊý¾Ý¿â£¬NoSQL£¨Not only SQL£©
MVC¿ò¼Ü£ºAngularJS
Web·þÎñÆ÷£ºExpress
Ä£°åÒýÇæ£ºjade¡¢ejs¡¢htmljs¡¢swig¡¢hogan.js
¶þ¡¢´î½¨Node.js¿ª·¢»·¾³
2.1¡¢°²×°Node.js
È¥¹ÙÍøÏÂÏÂÔØ×îа汾µÄNode.jsÒ»²½Ò»²½°´Ìáʾ°²×°¼´¿É£¬Èç¹û°²×°Ê§°Ü¾ÍÊÖ¶¯°²×°£¬½«Node.jsµÄ°²×°Î»ÖÃÅäÖõ½»·¾³±äÁ¿µÄpathÖС£

°²×°Íê³ÉºóÆô¶¯ÃüÁîÐУ¬²âÊÔ£º

2.2¡¢°²×°IDE¿ª·¢Node.js²å¼þ
Èç¹û²»Ê¹ÓÃIDE¿ª·¢ÏîĿЧÂʽϵͣ¬ÔںܶàÖ÷Á÷µÄ¼¯³É¿ª·¢»·¾³£¨IDE£©Öж¼¿ÉÒÔ°²×°²å¼þÖ§³ÖNode.js¿ª·¢£¬ÈçEclipse£¬ÕâÀïÎÒÃÇÒÔHBuilderΪÀý£º
Æô¶¯HBuilder->¹¤¾ß->²å¼þ°²×°

°²×°³É¹¦ºó¾Í¿ÉÒÔн¨Node.jsÏîÄ¿ÁË£º

ÕâÀïÑ¡ÔñHello World£¬Ð½¨ºÃµÄÏîÄ¿ÈçÏ£º

hello-world-server.jsÎļþ¾ÍÊÇÒ»¸ö¼òµ¥µÄweb·þÎñÆ÷£¬ÓÒ¼üÑ¡Ôñ¡°ÔËÐз½Ê½¡±->"Node
Application"
¿ØÖÆÌ¨Ìáʾ¡°Server running at http://127.0.0.1:1337/¡±ÔÚä¯ÀÀÆ÷²é¿´µÄЧ¹ûÈçÏ£º

Èý¡¢µÚÒ»¸öNode.js³ÌÐò
ÔÚÉÏÃæµÄʾÀýÖУ¬ÎÒÃÇÊÇͨ¹ýIDEÍê³É±àÒëÓëÔËÐе쬯äʵÊÖ¶¯ÔËÐÐÒ²¿ÉÒÔ£¬±ÈÈç±àдһ¶Î´úÂëÈçÏ£º
server.js
//ÒÀÀµÒ»¸öhttpÄ£¿é£¬Ï൱ÓÚjavaÖеÄimport£¬ÓëC#ÖеÄusing
var http = require('http');
//´´½¨Ò»¸ö·þÎñÆ÷¶ÔÏó
server = http.createServer(function (req, res)
{
//ÉèÖÃÇëÇó³É¹¦Ê±ÏìӦͷ²¿µÄMIMEΪ´¿Îı¾
res.writeHeader(200, {"Content-Type":
"text/plain"});
//Ïò¿Í»§¶ËÊä³ö×Ö·û
res.end("Hello World\n");
});
//È÷þÎñÆ÷¼àÌý±¾µØ8000¶Ë¿Ú¿ªÊ¼ÔËÐÐ
server.listen(8000,'127.0.0.1');
console.log("server is runing at 127.0.0.1:8000"); |
ÔÚnode»·¾³Ï½âÊÍÔËÐУº

ÔËÐнá¹û£º

ÒýÈë required Ä£¿é£ºÎÒÃÇ¿ÉÒÔʹÓà require Ö¸ÁîÀ´ÔØÈë Node.js Ä£¿é¡£
´´½¨·þÎñÆ÷£º·þÎñÆ÷¿ÉÒÔ¼àÌý¿Í»§¶ËµÄÇëÇó£¬ÀàËÆÓÚTomCat¡¢IIS¡¢Apache ¡¢Nginx µÈ
HTTP ·þÎñÆ÷¡£
½ÓÊÕÇëÇóÓëÏìÓ¦ÇëÇó ·þÎñÆ÷ºÜÈÝÒ×´´½¨£¬¿Í»§¶Ë¿ÉÒÔʹÓÃä¯ÀÀÆ÷»òÖÕ¶Ë·¢ËÍ HTTP ÇëÇ󣬷þÎñÆ÷½ÓÊÕÇëÇóºó·µ»ØÏìÓ¦Êý¾Ý¡£
µÚÒ»ÐÐÇëÇó£¨require£©Node.js ×Ô´øµÄ http Ä£¿é£¬²¢ÇÒ°ÑËü¸³Öµ¸ø http ±äÁ¿¡£
½ÓÏÂÀ´ÎÒÃǵ÷Óà http Ä£¿éÌṩµÄº¯Êý£º createServer ¡£Õâ¸öº¯Êý»á·µ»Ø Ò»¸ö¶ÔÏó£¬Õâ¸ö¶ÔÏóÓÐÒ»¸ö½Ð×ö
listen µÄ·½·¨£¬Õâ¸ö·½·¨ÓÐÒ»¸öÊýÖµ²ÎÊý£¬ Ö¸¶¨Õâ¸ö HTTP ·þÎñÆ÷¼àÌýµÄ¶Ë¿ÚºÅ¡£
ËÄ¡¢NPM£¨Node.js°ü¹ÜÀíÆ÷£©
NPMÊÇËæÍ¬NodeJSÒ»Æð°²×°µÄ°ü¹ÜÀí¹¤¾ß£¬Äܽâ¾öNodeJS´úÂ벿ÊðÉϵĺܶàÎÊÌ⣬³£¼ûµÄʹÓó¡¾°ÓÐÒÔϼ¸ÖÖ£º
a)¡¢ÔÊÐíÓû§´ÓNPM·þÎñÆ÷ÏÂÔØ±ðÈ˱àдµÄµÚÈý·½°üµ½±¾µØÊ¹Óá£
b)¡¢ÔÊÐíÓû§´ÓNPM·þÎñÆ÷ÏÂÔØ²¢°²×°±ðÈ˱àдµÄÃüÁîÐгÌÐòµ½±¾µØÊ¹Óá£
c)¡¢ÔÊÐíÓû§½«×Ô¼º±àдµÄ°ü»òÃüÁîÐгÌÐòÉÏ´«µ½NPM·þÎñÆ÷¹©±ðÈËʹÓá£
¹ÙÍø£ºhttps://www.npmjs.com/
4.1¡¢²é¿´npm°æ±¾
ÓÉÓÚаæµÄnodejsÒѾ¼¯³ÉÁËnpm£¬ËùÒÔ֮ǰnpmÒ²Ò»²¢°²×°ºÃÁË¡£Í¬Ñù¿ÉÒÔͨ¹ýÊäÈë
"npm -v" À´²âÊÔÊÇ·ñ³É¹¦°²×°¡£ÃüÁîÈçÏ£¬³öÏÖ°æ±¾Ìáʾ±íʾ°²×°³É¹¦:

4.2¡¢Éý¼¶npm
Èç¹ûÄã°²×°µÄÊǾɰ汾µÄ npm£¬¿ÉÒÔºÜÈÝÒ×µÃͨ¹ý npm ÃüÁîÀ´Éý¼¶
npm install npm -g

4.3¡¢°²×°Ä£¿é
npm install <Module Name> -²ÎÊý
Èç¹û´ø²ÎÊý-g±íʾȫ¾Ö°²×°£¬·ñÔòÖ»Êǰ²×°µ½Ä³¸öĿ¼Ï¡£
ÒÔÏÂʵÀý£¬ÎÒÃÇʹÓà npm ÃüÁî°²×°³£ÓÃµÄ Node.js web¿ò¼ÜÄ£¿é express

4.4¡¢Ð¶ÔØÄ£¿é
ÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÃüÁîÀ´Ð¶ÔØ Node.js Ä£¿é¡£
npm uninstall <Module Name>
ÈçÏÈʹÓð²×°Ö¸Áî°²×°bootstrap:
npm install bootstrap
ÔÙʹÓÃÐ¶ÔØÖ¸Áîɾ³ýÄ£¿é£º
npm uninstall bootstrap
¿ÉÒÔµ½ /node_modules/ Ŀ¼Ï²鿴°üÊÇ·ñ»¹´æÔÚ
4.5¡¢Ä£¿éÁбí
ʹÓÃÄ£¿éÁбíÃüÁî¿ÉÒÔ·½±ãµÄ¿´µ½µ±Ç°ÏîÄ¿ÖÐÒÀÀµµÄ°ü£º
npm ls

4.6¡¢¸üÐÂÄ£¿é
ÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÃüÁî¸üÐÂÄ£¿é£º
npm update Ä£¿éÃû³Æ
npm up -g Ä£¿éÃû³Æ
4.7¡¢ËÑË÷Ä£¿é
npm search Ä£¿éÃû³Æ
4.8¡¢NPM ³£ÓÃÃüÁî
³ýÁ˱¾Õ½éÉܵIJ¿·ÖÍ⣬NPM»¹ÌṩÁ˺ܶ๦ÄÜ£¬package.jsonÀïÒ²ÓкܶàÆäËüÓÐÓõÄ×ֶΡ£
³ýÁË¿ÉÒÔÔÚnpmjs.org/doc/²é¿´¹Ù·½ÎĵµÍ⣬ÕâÀïÔÙ½éÉÜһЩNPM³£ÓÃÃüÁî¡£
NPMÌṩÁ˺ܶàÃüÁÀýÈçinstallºÍpublish£¬Ê¹ÓÃnpm help¿É²é¿´ËùÓÐÃüÁî¡£
NPMÌṩÁ˺ܶàÃüÁÀýÈçinstallºÍpublish£¬Ê¹ÓÃnpm help¿É²é¿´ËùÓÐÃüÁî¡£
ʹÓÃnpm help <command>¿É²é¿´Ä³ÌõÃüÁîµÄÏêϸ°ïÖú£¬ÀýÈçnpm help
install¡£
ÔÚpackage.jsonËùÔÚĿ¼ÏÂʹÓÃnpm install . -g¿ÉÏÈÔÚ±¾µØ°²×°µ±Ç°ÃüÁîÐгÌÐò£¬¿ÉÓÃÓÚ·¢²¼Ç°µÄ±¾µØ²âÊÔ¡£
ʹÓÃnpm update <package>¿ÉÒ԰ѵ±Ç°Ä¿Â¼ÏÂnode_modules×ÓĿ¼Àï±ßµÄ¶ÔӦģ¿é¸üÐÂÖÁ×îа汾¡£
ʹÓÃnpm update <package> -g¿ÉÒÔ°ÑÈ«¾Ö°²×°µÄ¶ÔÓ¦ÃüÁîÐгÌÐò¸üÐÂÖÁ×îа档
ʹÓÃnpm cache clear¿ÉÒÔÇå¿ÕNPM±¾µØ»º´æ£¬ÓÃÓÚ¶Ô¸¶Ê¹ÓÃÏàͬ°æ±¾ºÅ·¢²¼Ð°汾´úÂëµÄÈË¡£
ʹÓÃnpm unpublish <package>@<version>¿ÉÒÔ³·Ïú·¢²¼×Ô¼º·¢²¼¹ýµÄij¸ö°æ±¾´úÂë¡£
4.9¡¢¸ü»»NPM ¾µÏñ
ÒòΪnpmµÄ·þÎñÆ÷ÔÚ¹úÍ⣬ÔÚÍøÂç״̬²»ºÃµÄÇé¿öÏÂÒýÈëÒ»¸öÄ£¿é»áÒòÎªÍøÂçÑÓ³Ù¶øÊ§°Ü£¬¿ÉÒÔ¸ü»»³É¹úÄÚËٶȸü¿ìµÄ¾µÏñ·þÎñÆ÷£¬ÕâÀïÒÔʹÓÃÌÔ±¦
NPM ¾µÏñ£¨http://npm.taobao.org/£©ÎªÀý£º
npm install -g cnpm --registry=https://registry.npm.taobao.org

ÕâÑù¾Í¿ÉÒÔʹÓà cnpm ÃüÁîÀ´°²×°Ä£¿éÁË£º
¡ç cnpm install [name]

ÕâÊÇÒ»¸öÍêÕû npmjs.org ¾µÏñ£¬Äã¿ÉÒÔÓô˴úÌæ¹Ù·½°æ±¾(Ö»¶Á)£¬Í¬²½ÆµÂÊĿǰΪ 10·ÖÖÓ
Ò»´ÎÒÔ±£Ö¤¾¡Á¿Óë¹Ù·½·þÎñͬ²½¡£
ÈçÊǰ²×°Ê§°Ü£¬¿ÉÒÔÊÔÊÔ£º
alias cnpm =
"npm --registry = https: // registry.npm
.taobao .org \
--cache = $HOME /.npm /.cache/cnpm \
--disturl = https: //npm.taobao.org/dist \
--userconfig = $HOME/.cnpmrc"
# Or alias it in .bashrc or .zshrc
$ echo '\ n#alias for cnpm\nalias cnpm = "npm
--registry = https://registry.npm.taobao.org \
--cache = $HOME/.npm/.cache /cnpm \
--disturl = https: //npm.taobao.org /dist \
--userconfig = $HOME/.cnpmrc"' >> ~/.zshrc
&& source ~/.zshrc |
Îå¡¢Express
Express ÊÇÒ»¸ö¼ò½à¶øÁé»îµÄ node.js WebÓ¦Óÿò¼Ü, ÌṩÁËһϵÁÐÇ¿´óÌØÐÔ°ïÖúÄã´´½¨¸÷ÖÖ
Web Ó¦Ó㬺ͷḻµÄ HTTP ¹¤¾ß¡£
ʹÓà Express ¿ÉÒÔ¿ìËٵشһ¸öÍêÕû¹¦ÄܵÄÍøÕ¾¡£Ê¹ÓÃNode.js×÷ΪAngularJS¿ª·¢Web·þÎñÆ÷µÄ×î¼Ñ·½Ê½ÊÇʹÓÃExpressÄ£¿é¡£
Express¹ÙÍø£º http://expressjs.com/
Express4.x API£ºhttp://expressjs.com/zh-cn/4x/api.html

5.2¡¢Express¿ò¼ÜºËÐÄÌØÐÔ
¿ÉÒÔÉèÖÃÖмä¼þÀ´ÏìÓ¦ HTTP ÇëÇó¡£
¶¨ÒåÁË·ÓɱíÓÃÓÚÖ´Ðв»Í¬µÄ HTTP ÇëÇó¶¯×÷¡£
¿ÉÒÔͨ¹ýÏòÄ£°å´«µÝ²ÎÊýÀ´¶¯Ì¬äÖȾ HTML Ò³Ãæ¡£
·á¸»µÄ HTTP ¿ì½Ý·½·¨ºÍÈÎÒâÅÅÁÐ×éºÏµÄ Connect Öмä¼þ£¬ÈÃÄã´´½¨½¡×³¡¢ÓÑºÃµÄ API
±äµÃ¼È¿ìËÙÓÖ¼òµ¥¡£
Express ²»¶Ô Node.js ÒÑÓеÄÌØÐÔ½øÐжþ´Î³éÏó£¬ÎÒÃÇÖ»ÊÇÔÚËüÖ®ÉÏÀ©Õ¹ÁË Web Ó¦ÓÃËùÐèµÄ»ù±¾¹¦ÄÜ¡£
5.3¡¢°²×° Express
°²×° Express ²¢½«Æä±£´æµ½ÒÀÀµÁбíÖУº
npm install express --save

ÒÔÉÏÃüÁîÈ«¾Ö°²×°express¡£Ò²¿É°²×°Ê±Ö¸¶¨°²×°Öмä¼þ¡£
body-parser - node.js Öмä¼þ£¬ÓÃÓÚ´¦Àí JSON, Raw, Text ºÍ
URL ±àÂëµÄÊý¾Ý¡£
cookie-parser - Õâ¾ÍÊÇÒ»¸ö½âÎöCookieµÄ¹¤¾ß¡£Í¨¹ýreq.cookies¿ÉÒÔÈ¡µ½´«¹ýÀ´µÄcookie£¬²¢°ÑËüÃÇת³É¶ÔÏó¡£
multer - node.js Öмä¼þ£¬ÓÃÓÚ´¦Àí enctype="multipart/form-data"£¨ÉèÖÃ±íµ¥µÄMIME±àÂ룩µÄ±íµ¥Êý¾Ý¡£
¡ç npm install body-parser --save
¡ç npm install cookie-parser --save
¡ç npm install multer --save
ĬÈÏÕâЩģ¿é¶¼ÒѾÌí¼Ó¡£
5.4¡¢µÚÒ»¸öExpress¿ò¼ÜʵÀý
½ÓÏÂÀ´ÎÒÃÇʹÓà Express ¿ò¼ÜÀ´Êä³ö "Hello World"¡£
ÒÔÏÂʵÀýÖÐÎÒÃÇÒýÈëÁË express Ä£¿é£¬²¢ÔÚ¿Í»§¶Ë·¢ÆðÇëÇóºó£¬ÏìÓ¦ "Hello World"
×Ö·û´®¡£
´´½¨Ò»¸öĿ¼£¬ÈçProject£¬½øÈëÃüÁîÐУº
ʹÓÃnpm install express µ¼ÈëexpressÄ£¿é¡£
ÔÚĿ¼Ï´´½¨hello.jsÎļþ£¬ÈçÏÂËùʾ£º
//ÒýÈëexpressÄ£¿é
var express = require('express');
//´´½¨Ò»¸öapp¶ÔÏó£¬ÀàËÆÒ»¸öweb Ó¦Óã¨ÍøÕ¾£©
var app = express();
//½ÓÊÜÖ¸¶¨Â·¾¶µÄÇëÇó£¬Ö¸¶¨»Øµ÷º¯Êý
app.get('/', function (req, res){
res.send('Hello World');
});
//´´½¨Ò»¸öweb·þÎñÆ÷£¬¿ÉÒÔÈÏΪ¾ÍÊÇweb·þÎñÆ÷¶ÔÏó
//¼àÌý8081¶Ë¿Ú£¬µ±¼àÌý³É¹¦Ê±»Øµ÷
var server = app.listen(8081, function () {
var host = server.address().address; //µØÖ·
var port = server.address().port; //¶Ë¿Ú
console.log("Ó¦ÓÃʵÀý£¬·ÃÎʵØÖ·Îª http://%s:%s",
host, port);
});
}) |
ʹÓÃnodeÖ´ÐÐjs£º
ÔËÐнá¹û£º

5.5¡¢Ê¹ÓÃNodeclipse¿ª·¢ExpressÏîÄ¿
Èç¹ûÖ±½ÓʹÓüÇʱ¾Ð§Âʻ᲻¸ß£¬nodeclipse²å¼þ¿ÉÒÔ·½±ãµÄ´´½¨Ò»¸öExpressÏîÄ¿£¬²½ÖèÈçÏ£º

´´½¨ºÃµÄÏîÄ¿ÈçÏ£º

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 app = express();
//Ö¸¶¨ÊÓͼÒýÇæÎªejs
app.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 handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.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·þÎñÆ÷£º
#!/usr/bin/env
node
/**
* ÒÀÀµÄ£¿é£¬µ¼Èë
*/
var app = require('../app');
var debug = require('debug')('nodejsexpress:server');
var http = require('http');
/**
* ´ÓÉÏÏÂÎÄ»·¾³ÖлñµÃ¼àÌý¶Ë¿Ú£¬Èç¹û¿ÕÔò3000
*/
var port = normalizePort (process.env.PORT ||
'3000');
app.set('port', port);
/**
* ´´½¨Web·þÎñÆ÷
*/
var server = http.createServer(app);
/**
* ¿ªÊ¼¼àÌý
*/
server.listen(port);
server.on('error', onError); //Ö¸¶¨·¢Éú´íÎóʱµÄʼþ
server.on('listening', onListening); //µ±¼àÌý³É¹¦Ê±µÄ»Øµ÷
/**
* ¹æ·¶»¯¶Ë¿Ú
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
*´íÎóʼþ¼àÌý
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
'Pipe ' + port
: 'Port ' + port;
//´íÎó´¦Àí
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;
}
}
/**
* µ±Óû§·ÃÎÊ·þÎñÆ÷³É¹¦Ê±µÄ»Øµ÷
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
} |
routers/index.js·ÓÉ£¬ÓеãÀàËÆ¿ØÖÆÆ÷»òServlet£º
var express
= require('express');
var router = express.Router();
/* »ñµÃÊ×Ò³ */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router; |
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> |
ÔÚwwwÉÏÓÒ¼üÑ¡Ôñ¡°ÔËÐз½Ê½¡±->¡°Node Application¡±ÔËÐнá¹û£º


5.6¡¢ejs»ù´¡
ejsÊÇÒ»¸öExpress WebÓ¦ÓõÄÄ£°åÒýÇæ£¬ÔÚNodeJS¿ª·¢ÖпÉÒÔÑ¡ÔñµÄÄ£°åÒýÇæ¿ÉÄÜÊÇËùÓÐWebÓ¦Óÿª·¢Öз¶Î§×î¹ãµÄ£¬Èçjade¡¢ejs¡¢htmljs¡¢swig¡¢hogan.js£¬µ«ejsÊÇ×îÈÝÒ×ÉÏÊֵģ¬Óëjsp,asp,phpµÄÔʼģ°åÒýÇæ·ç¸ñºÜÏñ¡£
¹ÙÍø£ºhttp://www.embeddedjs.com/
Ìí¼ÓÒ»¸öproduct.js·ÓÉ£º
var express = require('express');
var router = express.Router();
/* ²úÆ· */
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ÊÓͼÓëÖ¸¶¨µÄ¶ÔÏóäÖȾºóÊä³öµ½¿Í»§¶Ë
res.render('product', { title: 'Ìì¹·É̳Ç', pdts:products});
});
module.exports = router; |
ÔÚviewsĿ¼ÏÂÌí¼Óproduct.ejsÊÓͼ£¬ÕâÀïÊÇÒ»¸ö¼òµ¥µÄMVC£º
<!DOCTYPE
html>
<html>
<head>
<title>
<%= title %>
</title>
<link rel='stylesheet' href='/stylesheets/style.css'
/>
</head>
<body>
<h1><%= title %> - ²úÆ·Áбí</h1>
<table border="1" width="80%">
<tr>
<th>ÐòºÅ</th>
<th>Ãû³Æ</th>
<th>¼Û¸ñ</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£¬×¢²á¶¨ÒåºÃµÄÄ£¿éproduct£º
var index = require('./routes/index');
var users = require('./routes/users');
var pdts = require('./routes/product');
var app = express();
//Ö¸¶¨ÊÓͼÒýÇæÎªejs
app.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); |
ÔËÐнá¹û£º

5.7¡¢lodash
ÕâÊÇÒ»¸ö¾ßÓÐÒ»Ö½ӿڡ¢Ä£¿é»¯¡¢¸ßÐÔÄܵÈÌØÐ﵀ JavaScript ¹¤¾ß¿â¡£¿ÉÒԷdz£·½±ãµÄ²Ù×÷json¡£
¹ÙÍø£ºhttp://lodashjs.com/
°²×°£º
npm i -g npm
npm i --save lodash
°²×°Ê±ÏÈÓÃcdÇл»µ½µ±Ç°ÏîĿϡ£
Èç¹ûä¯ÀÀÆ÷ʹÓÿÉÒÔÖ±½ÓÒýÈ룺
<script src="lodash.js"></script>
Ìí¼ÓlodashÒÀÀµ£º

ÒÀÀµ³É¹¦ºó»áÔÚpackage.jsonÖÐÌí¼ÓÒýÓãº

ºǫ́Node.jsʹÓ㬿ÉÒÔÒýÈëÄ£¿é£º
//µ¼Èë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¡¢È¡³öµÚÒ»¸öÔªËØ
var obj1=_.first(products);
console.log(obj1.name); //ZTE U880
//2¡¢È¡³ö×îºóÒ»¸öÔªËØ
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¡¢Ö¸¶¨²éÕÒÌõ¼þ·µ»Ø²éÕÒµ½µÄ¶ÔÏó
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¡¢²éÕÒ¼Û¸ñΪ1899.8µÄ²úÆ·µÄkey
var obj6=_.findKey(products,{price:1899.8});
console.log(obj6); //1 |
APIµÄʹÓ÷dz£¼òµ¥£¬µ«ÐèҪעÒâ°æ±¾£¬¿ÉÒÔÏÖ²éÏÖÓã¬APIµØÖ·£ºhttps://lodash.com/docs/4.17.2
5.8¡¢²ÎÊý
5.8.1¡¢URLÖеIJÎÊýռλ
Checks route params (req.params), ex: /user/:id
127.0.0.1:3000/index£¬ÕâÖÖÇé¿öÏ£¬ÎÒÃÇΪÁ˵õ½index£¬ÎÒÃÇ¿ÉÒÔͨ¹ýʹÓÃreq.paramsµÃµ½£¬Í¨¹ýÕâÖÖ·½·¨ÎÒÃǾͿÉÒԺܺõĴ¦ÀíNodeÖеÄ·ÓÉ´¦ÀíÎÊÌ⣬ͬʱÀûÓÃÕâµã¿ÉÒԷdz£·½±ãµÄʵÏÖMVCģʽ£»
//»ñµÃ²úÆ·¸ù¾ÝId
router.get('/:id/:category',function(request,res,next){
res.send(request.params.id+","+request.params.category);
}); |
ÔËÐнá¹û£º

5.8.2¡¢URLÖеÄQueryString
Checks query string params (req.query), ex: ?id=12
127.0.0.1:3000/index?id=12£¬ÕâÖÖÇé¿öÏ£¬ÕâÖÖ·½Ê½ÊÇ»ñÈ¡¿Í»§¶Ëget·½Ê½´«µÝ¹ýÀ´µÄÖµ£¬Í¨¹ýʹÓÃreq.query.id¾Í¿ÉÒÔ»ñµÃ£¬ÀàËÆÓÚPHPµÄget·½·¨£»
router.get('/:id',function(request,res,next){
res.send("name:"+request.query.name);
}); |
ÔËÐнá¹û£º

5.8.3¡¢HTTPÕýÎÄÖеIJÎÊý
ÔÚpostÇëÇóÖлñµÃ±íµ¥ÖеÄÊý¾Ý¡£
Checks urlencoded body params (req.body), ex: id=
127.0.0.1£º300/index£¬È»ºópostÁËÒ»¸öid=2µÄÖµ£¬ÕâÖÖ·½Ê½ÊÇ»ñÈ¡¿Í»§¶Ëpost¹ýÀ´µÄÊý¾Ý£¬¿ÉÒÔͨ¹ýreq.body.id»ñÈ¡£¬ÀàËÆÓÚPHPµÄpost·½·¨£»

Ò³Ãæ£º
<!DOCTYPE
html>
<html>
<head>
<title>
<%= title %>
</title>
<link rel='stylesheet' href='/stylesheets/style.css'
/>
</head>
<body>
<h1><%= title %> - ²úÆ·Áбí</h1>
<table border="1" width="80%">
<tr>
<th>ÐòºÅ</th>
<th>Ãû³Æ</th>
<th>¼Û¸ñ</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>
<% } %>
</ul>
<p>
<%if(typeof msg!="undefined"){%>
<%=msg%>
<%}%>
</p>
<form action="pdt/add" method="post">
<p>
Ãû³Æ£º<input name="name" />
</p>
<p>
¼Û¸ñ£º<input name="price" />
</p>
<button>Ìí¼Ó</button>
</form>
</body>
</html> |
´úÂ룺
router.post('/add',function(request,res,next){
var entity={name:request.body.name,price:request.body.price};
products.push(entity);
//½«productÊÓͼÓëÖ¸¶¨µÄ¶ÔÏóäÖȾºóÊä³öµ½¿Í»§¶Ë
res.render('product', { title: 'Ìì¹·É̳Ç', pdts:products,msg:"Ìí¼Ó³É¹¦"});
}); |
½á¹û£º

5.9¡¢JSON
Èç¹ûÐèÒªNode.jsÏòÍâÌṩ·µ»ØJSONµÄ½Ó¿Ú£¬ExpressÒ²ÊǷdz£·½±ãµÄ£¬¿ÉÒÔʹÓÃÔÀ´ÔÚä¯ÀÀÆ÷ÖÐʹÓõ½µÄJSON¶ÔÏó£¬ÕâÊÇÒ»¸öä¯ÀÀÆ÷ÄÚÖöÔÏóÔÚ·þÎñ¿ÉÒÔÖ±½ÓʹÓãº
½«¶ÔÏóÐòÁл¯³É×Ö·û£º
//¶ÔÏó
var rose={"name":"Rose","weight":"65"};
//ÐòÁл¯³É×Ö·û´®
var str=JSON.stringify(rose);
alert(str); |
½á¹û£º

·´ÐòÁл¯£¬½«×Ö·ûת»»³É¶ÔÏó£º
//½«×Ö·û´®×ª»»³ÉJavaScript¶ÔÏó
var markStr='{"name":"mark","weight":"188"}';
var mark=JSON.parse(markStr);
alert(mark.name+"£¬"+mark.weight); |
½á¹û£º

ExpressÒѾ·â×°ÁËÒ»¸öjson·½·¨£¬Ö±½Óµ÷Óø÷½·¨¾Í¿ÉÒÔÐòÁл¯¶ÔÏó£º
/* ²úÆ· */
router.get('/rest', function(req, res, next) {
res.json(products);
}); |
ÔËÐнá¹û£º

Áù¡¢RESTful£¨±íÊöÐÔ×´Ì¬×ªÒÆ£©
RESTÊÇÓ¢ÎÄRepresentational State TransferµÄËõд£¬ÖÐÎijÆÖ®Îª¡°±íÊöÐÔ×´Ì¬×ªÒÆ¡±
»ùÓÚHTTPÐÒé
ÊÇÁíÒ»ÖÖ·þÎñ¼Ü¹¹
´«µÝÊÇJSON¡¢POX£¨Plain Old XML£©¶ø²»ÊÇSOAP¸ñʽµÄÊý¾Ý
³ä·ÖÀûÓÃHTTPν´Ê£¨Verb£©
²àÖØÊý¾ÝµÄ´«Ê䣬ҵÎñÂß¼½»¸ø¿Í»§¶Ë×ÔÐд¦Àí
RESTÊÇÒ»ÖÖ·Ö²¼Ê½·þÎñ¼Ü¹¹µÄ·ç¸ñÔ¼Êø£¬ÏñJava¡¢.Net£¨WCF¡¢WebAPI£©¶¼ÓжԸÃÔ¼ÊøµÄʵÏÖ£¬Ê¹URL±äµÃ¸ü¼ÓÓÐÒâÒ壬¸ü¼Ó¼ò½àÃ÷ÁË£¬È磺
http://www.zhangguo.com/products/1 getÇëÇó ±íʾ»ñµÃËùÓвúÆ·µÄµÚ1¸ö
http://www.zhangguo.com/products/product postÇëÇó ±íʾÌí¼ÓÒ»¸ö²úÆ·
http://www.zhangguo.com/products/1/price getÇëÇó ±íʾ»ñµÃµÚ1¸ö²úÆ·µÄ¼Û¸ñ
http://www.zhangguo.com/products/1 deleteÇëÇó ɾ³ý±àºÅΪ1µÄ²úÆ·
RESTÉè¼ÆÐèÒª×ñѵÄÔÔò
ÍøÂçÉϵÄËùÓÐÊÂÎï¶¼±»³éÏóΪ×ÊÔ´£¨resource£©£»
ÿ¸ö×ÊÔ´¶ÔÓ¦Ò»¸öΨһµÄ×ÊÔ´±êʶ·û£¨resource identifier£©£»
ͨ¹ýͨÓõÄÁ¬½ÓÆ÷½Ó¿Ú£¨generic connector interface£©¶Ô×ÊÔ´½øÐвÙ×÷£»
¶Ô×ÊÔ´µÄ¸÷ÖÖ²Ù×÷²»»á¸Ä±ä×ÊÔ´±êʶ·û£»
ËùÓеIJÙ×÷¶¼ÊÇÎÞ״̬µÄ£¨stateless£©
ν´Ê
GET
±íʾ²éѯ²Ù×÷£¬Ï൱ÓÚRetrieve¡¢Select²Ù×÷
POST
±íʾ²åÈë²Ù×÷£¬Ï൱ÓÚCreate£¬Insert²Ù×÷
PUT
±íʾÐ޸IJÙ×÷£¬Ï൱ÓÚUpdate²Ù×÷
DELETE
±íʾɾ³ý²Ù×÷£¬Ï൱ÓÚDelete²Ù×÷
ÆäËü»¹ÓУº

NodeJS+Express¿ÉÒÔºÜÈÝÒ×µÄʵÏÖ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 :"À¶É«"});
cars.push ({id:201704, name:"Honda"
,price:190, speed:"170km /h",color :
"ºÚÉ«"});
cars.push ({id:201705, name :"QQ",pric
e:130,speed:"210km /h", color :"°×É«"});
/* Get */
/*»ñµÃËùÓÐÆû³µ*/
/*url /cars/*/
router.get('/', function(req, res, next) {
res.json(cars);
});
/*Get*/
/*»ñµÃÆû³µÍ¨¹ýid*/
/*url£º/cars/:id */
router.get('/:id', function(req, res, next)
{
//´Ó·¾¶ÖÐÓ³Éä²ÎÊý£¬×ª»»³ÉÊý×Ö
var id=parseInt(req.params.id);
var car=_.find(cars,{id:id});
res.json(car);
});
/*Post*/
/*Ìí¼ÓÆû³µ*/
/*url£º/cars/car */
router.post('/car', function(req, res, next)
{
var car=req.body; //´ÓÇëÇóÕýÎÄÖлñµÃjson¶ÔÏó
car.id=_.last(cars).id+1; //½«±àºÅÐÞ¸ÄΪ×îºóÒ»Á¾³µµÄ±àºÅ+1
cars.push(car); //½«Æû³µ¶ÔÏóÌí¼Óµ½¼¯ºÏÖÐ
res.json(car); //½«Ìí¼Ó³É¹¦µÄ³µÒÔjsonµÄÐÎʽ·µ»Ø
});
/*Put*/
/*ÐÞ¸ÄÆû³µ*/
/*url£º/cars/car */
router.put('/car', function(req, res, next)
{
var car=req.body; //´ÓÇëÇóÕýÎÄÖлñµÃjson¶ÔÏó
console.log(req.body);
var index=_.findIndex(cars,{id:parseInt(car.id)});
//¸ù¾Ýid»ñµÃ³µÔÚ¼¯ºÏÖеÄϱê
cars[index]=car; //Ìæ»»Ô¶ÔÏó
//res.json(car); //½«Ð޸ĺóµÄ³µÒÔjsonµÄÐÎʽ·µ»Ø
res.send({status:"success", message:"¸üгɹ¦!"});
});
/*Delete*/
/*ɾ³ýÆû³µ*/
/*url£º/cars/:id */
router.delete('/id/:id', function(req, res,
next) {
//»ñµÃurlÖеıàºÅ²ÎÊý
var id=parseInt(req.params.id);
var index=_.findIndex(cars,{id:id}); //¸ù¾Ýid»ñµÃ³µÔÚ¼¯ºÏÖеÄϱê
cars.splice(index,1); //ÔÚcarsÊý×éÖÐɾ³ýϱê´Óindex¿ªÊ¼µÄ1ÌõÊý¾Ý
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();
//Ö¸¶¨ÊÓͼÒýÇæÎªejs
app.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 handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.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 */
/*»ñµÃËùÓÐÆû³µ*/
/*url /cars/*/

/*Get*/
/*»ñµÃÆû³µÍ¨¹ýid*/
/*url£º/cars/:id */

/*Post*/
/*Ìí¼ÓÆû³µ*/
/*url£º/cars/car */


²ÎÊýÖеÄjson¸ñʽһ¶¨ÒªÊ¹Óñê×¼¸ñʽ£¬×¢ÒâÒýºÅ£¬×¢ÒâContent-Type£¬Ä¬ÈϵÄContent-TypeÀàÐÍÊÇ£ºapplication/x-www-form-urlencoded
/*Put*/
/*ÐÞ¸ÄÆû³µ*/
/*url£º/cars/car */


/*Delete*/
/*ɾ³ýÆû³µ*/
/*url£º/cars/:id */


node.js¿çÓò
ÐÞ¸Äapp.jsÎļþÀ¹½ØËùÓеÄÇëÇó£¬ÐÞ¸ÄÍ·²¿
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.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin",
"*");
res.header("Access-Control-Allow-Headers",
"content-type");
res.header("Access-Control-Allow-Methods",
"PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1');
res.header("Content-Type", "application/json;charset=utf-8");
if(req.method == "OPTIONS") {
res.send("200");
} else {
next();
}
}); |
½á¹û£º

Æß¡¢Ê¾ÀýÏÂÔØ
git£ºhttps://coding.net/u/zhangguo5/p/NodeJS001/git
git£ºhttps://coding.net/u/zhangguo5/p/NodeJSExpress/git
|