1、回調函數javascript
node 的全部API都支持回調函數。阻塞是按順序執行的,而非阻塞是不須要按順序的,因此若是須要處理回調函數的參數,就須要些在函數內。html
Node.js 異步編程的直接體現就是回調。異步編程依託於回調來實現,但不能說使用了回調後程序就異步化了。java
2、事件驅動node
var events = require("events"); var eventEmitter = new events.EventEmitter(); // 定義事件觀察者、監聽器、或者叫處理器 var eventHandler = function handler(){ console.log("handle event") } // 事件註冊 var eventEmitter.on("demo", eventHandler); // 事件發佈 var eventEmitter.emit("demo")
3、bufferc++
buffer類用來建立一個專門存放二進制數據的緩衝區,buffer相似於一個整數數組。web
3.一、支持的字符編碼數據庫
3.二、建立Buffer類express
3.三、寫緩衝區編程
3.四、讀緩衝區json
4、Stream
5、模塊系統
模塊是爲了更好的代碼服用,文件和模塊一一對應,能夠是 js 代碼,json,或者 c/c++ 擴展;
模塊建立的兩種方式: exports, module.exports
exports.world = function () {
console.log("hello world!")
}
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
使用模塊:require
var hello = require('hello');
hello.world()
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
6、函數
function hello(say) {
say();
}
hello(function(){
console.log("hello node!");
})
hello(()=> console.log("hello lambda!"))
7、路由
a simple http server
var http = require("http");
var url = require("url");
function route(request){
return url.parse(request.url).pathname;
}
http.createServer((request, response) => {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(route(request));
response.end();
}).listen(8888);
{
protocol: null,
slashes: null,
auth:null,
host: null,
port: null,
hostname: null,
hash: null,
search: "?name=xxxxx&url=aaaaa",
query: {
name: 'xxxxx',
url: 'aaaaa'
},
pathname: '/user',
path: '/username=xxxxx&url=aaaaa?',
href: 'name=xxxxx&url=aaaaa'
}
var http = require('http');
var querystring = require('querystring');
http.createServer(function(req, res){
// 定義了一個post變量,用於暫存請求體的信息
var post = '';
// 經過req的data事件監聽函數,每當接受到請求體的數據,就累加到post變量中
req.on('data', function(chunk){
post += chunk;
});
// 在end事件觸發後,經過querystring.parse將post解析爲真正的POST請求格式,而後向客戶端返回。
req.on('end', function(){
post = querystring.parse(post);
res.end(util.inspect(post));
});
}).listen(3000);
8、全局對象
當 console.log 接收到多個參數時,會進行格式化輸出:
console.log('Hello world'); // Hello world
console.log('byvoid%diovyb'); // byvoid%diovyb
console.log('byvoid%diovyb', 1991); //byvoid1991iovyb
9、Node.js經常使用工具
10、文件系統
var fs = require("fs");
fs.readFile("filename", (err, data)=> {
console.log("read file");
})
11、Express框架
Express 是一個簡潔而靈活的應用框架。
var express = require('express');
var app = express();
app.get('/', 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)
})
11.一、Request對象
11.二、 Response對象
11.三、路由
var express = require('express');
var app = express();
// 主頁輸出 "Hello World"
app.get('/', function (req, res) {
console.log("主頁 GET 請求");
res.send('Hello GET');
})
// POST 請求
app.post('/', function (req, res) {
console.log("主頁 POST 請求");
res.send('Hello POST');
})
// /del_user 頁面響應
app.get('/del_user', function (req, res) {
console.log("/del_user 響應 DELETE 請求");
res.send('刪除頁面');
})
// /list_user 頁面 GET 請求
app.get('/list_user', function (req, res) {
console.log("/list_user GET 請求");
res.send('用戶列表頁面');
})
// 對頁面 abcd, abxcd, ab123cd, 等響應 GET 請求
app.get('/ab*cd', function(req, res) {
console.log("/ab*cd GET 請求");
res.send('正則匹配');
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("應用實例,訪問地址爲 http://%s:%s", host, port)
})
11.四、靜態文件
能夠使用 express.static 中間件來設置靜態文件路徑:
app.use(express.static('public'));
11.五、文件上傳
html>
<head>
<title>文件上傳表單</title>
</head>
<body>
<h3>文件上傳:</h3>
選擇一個文件上傳: <br />
<form action="/file_upload" method="post" enctype="multipart/form-data">
<input type="file" name="image" size="50" />
<br />
<input type="submit" value="上傳文件" />
</form>
</body>
</html>
服務端代碼:
var express = require('express');
var app = express();
var fs = require("fs");
var bodyParser = require('body-parser');
var multer = require('multer');
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}).array('image'));
app.get('/index.htm', function (req, res) {
res.sendFile( __dirname + "/" + "index.htm" );
})
app.post('/file_upload', function (req, res) {
console.log(req.files[0]); // 上傳的文件信息
var des_file = __dirname + "/" + req.files[0].originalname;
fs.readFile( req.files[0].path, function (err, data) {
fs.writeFile(des_file, data, function (err) {
if( err ){
console.log( err );
}else{
response = {
message:'File uploaded successfully',
filename:req.files[0].originalname
};
}
console.log( response );
res.end( JSON.stringify( response ) );
});
});
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("應用實例,訪問地址爲 http://%s:%s", host, port)
})
12.六、 cookie管理
能夠使用中間件向 Node.js 服務器發送 cookie 信息,如下代碼輸出了客戶端發送的 cookie 信息:
var express = require('express')
var cookieParser = require('cookie-parser')
var util = require('util');
var app = express()
app.use(cookieParser())
app.get('/', function(req, res) {
console.log("Cookies: " + util.inspect(req.cookies));
})
app.listen(8081)
12、數據庫