node.js 安裝配置 npm ,express,ejs模板
本人近端時間看了下node.js,學習是從菜鳥教程 http://www.runoob.com/nodejs/nodejs-tutorial.html 入門。
首先講一下體會,首先自己是個java程式設計師,剛接觸node.js,有點新鮮就去學了,首先是安裝windows版的node.js。如果不熟悉環境配置,要選擇msi格式的,因為安裝的過程中會把環境變數給你配好。好了安裝好以後,要安裝express,express對node.js進行了封裝,對web的前後端互動很好。然後安裝ejs模板,ejs模板可以接受node.jsserver傳的值,當然ejs檔案也要經過node.js直譯器。就像java web 要經過tomcat ,java 要經過jvm一樣。所有檔案,如js檔案,ejs檔案,都需要經過node.js伺服器解釋,然後輸出到瀏覽器。首先 有很多分散的js檔案,這些js檔案每個js檔案都使用exports.world = function(){}或者function Hello() { }module.exports = Hello;把這個方法或模組暴露出去,var Hello = require('./hhhhhh'); hello = new Hello(); 去require這個hhhhh.js,就能獲得暴露出的物件,就可以拿來直接用。
這些js檔案都如果要啟動服務端的一個工程,就需要一個入口,這個入口就是一個繫結 埠,並通過listen(80,function())監聽埠。然後在瀏覽器中輸入localhost:80/就能訪問到伺服器。在安裝的伺服器根目錄下,放一個html檔案,就能使用localhost:80/**.html訪問到。node.js伺服器就相當於一個jvm,所有的檔案都要經過這個伺服器的解釋去執行。當然有些也不是必須在伺服器中解釋,不是服務端的js如一個js檔案,裡面只有一些平常的js方法(不是node.js中的方法),我們直接可以放在html中,而node.js的js檔案就不能放在html中,這樣會無法解釋。需要伺服器執行的js,都要通過繫結埠的js檔案執行,也就是,需要引入到繫結埠的js中。幫頂埠號的js相當於啟動了一個埠服務,只有啟動這個js,我們才能訪問他,相當於jetty啟動java web服務一樣。
node.js 是單執行緒的,但是我們可以通過fs.readFile('input.txt', function (err, data) {alert()}) 回撥函式去執行readFile函式的同時,去執行alert()函式。也可以使用事件繫結eventEmitter.on('data_received', function(){}實現併發, 的每一個 API 都是非同步的,並作為一個獨立執行緒執行,使用非同步函式呼叫,並處理併發。
node.js支援對檔案的讀寫,對二進位制資料流的讀寫,
node.js 路由功能可以獲得客戶端請求的地址,包括引數
node.js
的函式 可以以函式物件做引數傳遞,function say(word) { console.log(word); } function execute(someFunction, value) { someFunction(value);
} execute(say, "Hello");
node.js模組系統可以把一個檔案系統中的方法定義成一個模組,假如一個aaa.j裡面要簡歷一個模組s。可以使用exports 如:exports.world = function() { console.log('Hello World'); }去定義,也可以使用module.exports 如 function Hello() {}; module.exports = Hello; 去定義。然後在另一個js檔案中var Hello = require('./aaa'); hello = new Hello(); 去呼叫。注意require('./aaa');是引入aaa,js檔案,可以寫絕對路徑也可以寫相對路徑。
node.js 的全域性變數如 優點和thinkPhp框架的全域性變數相似。如__filename是當前模組檔案的路徑如:/web/com/runoob/nodejs/main.js。
node.js 有一些常用的方法:如util.isRegExp(object)表示是否是正則表示式。util.isDate(object)是否是時間
node.js的web服務
var http =require('http');var fs =require('fs');var url =require('url');// 建立伺服器 http.createServer(function(request, response){// 解析請求,包括檔名var pathname = url.parse(request.url).pathname;// 輸出請求的檔名 console.log("Request for "+ pathname +" received.");// 從檔案系統中讀取請求的檔案內容 fs.readFile(pathname.substr(1),function(err, data){if(err){ console.log(err);// HTTP 狀態碼: 404 : NOT FOUND// Content Type: text/plain response.writeHead(404,{'Content-Type':'text/html'});}else{// HTTP 狀態碼: 200 : OK// Content Type: text/plain response.writeHead(200,{'Content-Type':'text/html'});// 響應檔案內容 response.write(data.toString());}// 傳送響應資料 response.end();});}).listen(8081);// 控制檯會輸出以下資訊 console.log('Server running at http://127.0.0.1:8081/');在此檔案的同目錄下建立一個html,然後輸入localhost:8081/**.html就能訪問到。
node.js
express
安裝
npm install express --save
以上命令會將 Express 框架安裝在當期目錄的 node_modules 目錄中, node_modules 目錄下會自動建立 express 目錄。以下幾個重要的模組是需要與 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
Express 框架核心特性:
-
可以設定中介軟體來響應 HTTP 請求。
-
定義了路由表用於執行不同的 HTTP 請求動作。
-
可以通過向模板傳遞引數來動態渲染 HTML 頁面。
//express_demo.js 檔案var express =require('express');var app = express(); app.get('/aaa',function(req, res){ res.send('Hello World');})var server = app.listen(8081,function(){var host = server.address().address var port = server.address().port console.log("應用例項,訪問地址為 http://%s:%s", host, port)})通過app.get()就可以繫結一個類似javaweb的controller,然後去訪問這個路徑,node.js伺服器就能給瀏覽器響應,與有沒有aaa檔案沒有關係。
Express 應用使用回撥函式的引數: request 和 response 物件來處理請求和響應的資料。
app.get('/',function(req, res){// --})
request 和 response 物件的具體介紹:
Request 物件 - request 物件表示 HTTP 請求,包含了請求查詢字串,引數,內容,HTTP 頭部等屬性。常見屬性有:
- req.app:當callback為外部檔案時,用req.app訪問express的例項
- req.baseUrl:獲取路由當前安裝的URL路徑
- req.body / req.cookies:獲得「請求主體」/ Cookies
- req.fresh / req.stale:判斷請求是否還「新鮮」
- req.hostname / req.ip:獲取主機名和IP地址
- req.originalUrl:獲取原始請求URL
- req.params:獲取路由的parameters
- req.path:獲取請求路徑
- req.protocol:獲取協議型別
- req.query:獲取URL的查詢引數串
- req.route:獲取當前匹配的路由
- req.subdomains:獲取子域名
- req.accpets():檢查請求的Accept頭的請求型別
- req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages
- req.get():獲取指定的HTTP請求頭
- req.is():判斷請求頭Content-Type的MIME型別
Response 物件 - response 物件表示 HTTP 響應,即在接收到請求時向客戶端傳送的 HTTP 響應資料。常見屬性有:
- res.app:同req.app一樣
- res.append():追加指定HTTP頭
- res.set()在res.append()後將重置之前設定的頭
- res.cookie(name,value [,option]):設定Cookie
- opition: domain / expires / httpOnly / maxAge / path / secure / signed
- res.clearCookie():清除Cookie
- res.download():傳送指定路徑的檔案
- res.get():返回指定的HTTP頭
- res.json():傳送JSON響應
- res.jsonp():傳送JSONP響應
- res.location():只設置響應的Location HTTP頭,不設定狀態碼或者close response
- res.redirect():設定響應的Location HTTP頭,並且設定狀態碼302
- res.send():傳送HTTP響應
- res.sendFile(path [,options] [,fn]):傳送指定路徑的檔案 -會自動根據檔案extension設定Content-Type
- res.set():設定HTTP頭,傳入object可以一次設定多個頭
- res.status():設定HTTP狀態碼
- res.type():設定Content-Type的MIME型別
node.js處理靜態檔案
Express 提供了內建的中介軟體 express.static 來設定靜態檔案如:圖片, CSS, JavaScript 等。
你可以使用 express.static 中介軟體來設定靜態檔案路徑。例如,如果你將圖片, CSS, JavaScript 檔案放在 public 目錄下,你可以這麼寫:
var express =require('express');var app = express(); app.use(express.static('public'));啟動服務入口js。在瀏覽器中訪問 http://127.0.0.1:8081/images/logo.png(本例項採用了菜鳥教程的logo),就可以看到圖片。
node.js 多程序
我們都知道 Node.js 是以單執行緒的模式執行的,但它使用的是事件驅動來處理併發,這樣有助於我們在多核 cpu 的系統上建立多個子程序,從而提高效能。
每個子程序總是帶有三個流物件:child.stdin, child.stdout 和child.stderr。他們可能會共享父程序的 stdio 流,或者也可以是獨立的被導流的流物件。
Node 提供了 child_process 模組來建立子程序,方法有:
-
exec - child_process.exec 使用子程序執行命令,快取子程序的輸出,並將子程序的輸出以回撥函式引數的形式返回。
-
spawn - child_process.spawn 使用指定的命令列引數建立新執行緒。
-
fork - child_process.fork 是 spawn()的特殊形式,用於在子程序中執行的模組,如 fork('./son.js') 相當於 spawn('node', ['./son.js']) 。與spawn方法不同的是,fork會在父程序與子程序之間,建立一個通訊管道,用於程序之間的通訊。
1、首先需要安裝nodejs 的mysql包
npm install mysql
2、編寫nodejs與mysql互動的程式碼
var mysql = require('mysql'); var TEST_DATABASE = 'ceshi'; var TEST_TABLE = 'user'; //建立連線 var client = mysql.createConnection({ user: 'root', password: '', }); client.connect(); client.query("use " + TEST_DATABASE); client.query( 'SELECT * FROM '+TEST_TABLE, function selectCb(err, results, fields) { if (err) { throw err; } if(results) { for(var i = 0; i < results.length; i++) { console.log("%d\t%s\t%s", results[i].id, results[i].name, results[i].age); } } client.end(); } );
node.js .前後臺互動和資料傳遞。
本人使用 express 和ejs.首先利用npm install express和npm install ejs。當然jade 比較ejs更為強大。
node.js 檔案
exports.userlist = function(db) { return function(req, res) { var collection = db.get('usercollection'); collection.find({},{},function(e,docs){ res.render('userlist', { "userlist" : docs }); }); }; };這裡首先定義了一個function,接收我們傳過來的db變數,然後呼叫一個跟前面兩個route一樣的page render。我們告訴它需要讀取usercollection,做一個查詢,返回的資料儲存在docs變數中。一旦我們讀取到了內容,就呼叫render來渲染userlist模板頁面,userlist預設是在本目錄下views/userlist.ejs檔案。把獲取到的docs變數作為模板引擎中的userlist變數傳遞進去。
<!DOCTYPE
html>
<html>
<head>
<title>USERLIST</title>
<link rel=’stylesheet’ href=’/stylesheets/style.css’ />
</head>
<body>
<h1>Userlist</h1>
<ul>
<%
for(var i in userlist){
%>
<li><a href=”mailto:<%=userlist[i].email%>”><%=userlist[i].username%></a></li>
<% } %>
</ul>
</body>
</html>
ejs 是以ejs結尾的檔案,他在ejs中用<%=bbbb%>來引入js傳入的變數,其他的都是html一樣。怎麼樣是不是和jsp差不多呢。
下面是安裝
相信對於很多關注javascript發展的同學來說,nodejs已經不是一個陌生的詞眼。有關nodejs的相關資料網上已經鋪天蓋地。由於它的高併發特性,造就了其特殊的應用地位。
這裡不想談太多的nodejs的相關資訊。只說一下,windows系統下簡單nodejs環境配置。
第一步:下載安裝檔案
這裡用的是
第二步:安裝nodejs
下載完成之後,雙擊 node-v0.8.16-x86.msi,開始安裝nodejs,預設是安裝在C:\Program Files\nodejs下面
第三步:安裝相關環境
開啟C:\Program Files\nodejs目錄你會發現裡面自帶了npm,直接用npm安裝相環境既可
進入node.js command prompt 命令視窗
進入nodejs 安裝目錄 C:\Program Files\nodejs
鍵入命令:cd C:\Program Files\nodejs 既可
現在開始安裝相關環境
鍵入命令:npm install express 回車等待安裝express........
鍵入命令:npm install jade 回車等待安裝jade........
鍵入命令:npm install mysql回車等待安裝mysql........
........安裝什麼元件,取決於環境搭建需求
預設情況下上述元件都是安裝在C:\Program Files\nodejs\node_modules資料夾下 這也是nodejs相關元件的自動查詢路徑
第四步:建立一個工程
現在已經有express
express命令安裝在全域性才起作用!
所以express安裝的時候要用 npm install express -g
或者直接修改全域性路徑:
npm config set prefix "C:\Program Files\nodejs"
npm config set cache "C:\Program Files\nodejs\cache" (先建好cache目錄)
鍵入:express myapp (myapp是隨意起的工程名稱)
你會發現多了一個 C:\Program Files\nodejs\myapp 目錄
預設情況下:裡會自動建立
這幾個檔案,不做解釋,相信有過開發經驗的同學都能一眼明瞭。
複製node_modules到myapp下面
環境搭建到此完工,下面做一個demo測試!
在myapp下新建helloworld.js
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); }).listen(8888); console.log("nodejs start listen 8888 port!");
進入node.js command prompt 命令視窗,進入C:\Program Files\nodejs\myapp目錄
鍵入node helloworld.js
發現輸出 :
Hello World