nodejs
nodejs官方文档: https://nodejs.org/dist/latest-v16.x/docs/api/
vscode: https://code.visualstudio.com/api
全局对象
https://nodejs.org/dist/latest-v9.x/docs/api/globals.html
console.log(__dirname);
console.log(__filename);
// require exports
var time = 0;
var timer = setInterval(function() {
time += 2;
console.log(time + " seconds have passed");
if (time > 5) {
clearInterval(timer);
}
}, 2000);
回调函数
function callFunction(fun, name) {
fun(name);
}
callFunction(function(name) {
console.log(name + ' Bye');
}, 'rails365');
模块
app.js
var stuff = require('./count');
// var pi = require('./count').pi;
console.log(stuff.counter(['ruby', 'nodejs', 'react']));
console.log(stuff.adder(3));
// console.log(pi);
count.js
var adder = function(a) {
return `the sum of the 2 numbers is ${a+pi}`;
}
var pi = 3.14;
module.exports = {
counter: function(arr) {
return "There are " + arr.length + " elements in the array";
},
adder: adder
}
事件
https://nodejs.org/dist/latest-v9.x/docs/api/events.html
https://nodejs.org/dist/latest-v9.x/docs/api/util.html#util_util_inherits_constructor_superconstructor
var events = require('events');
var util = require('util');
var Person = function(name) {
this.name = name
}
util.inherits(Person, events.EventEmitter);
var xiaoming = new Person('xiaoming');
var lili = new Person('lili');
var lucy = new Person('lucy');
var person = [xiaoming, lili, lucy];
person.forEach(function(person) {
person.on('speak', function(message) {
console.log(person.name + " said: " + message);
})
})
xiaoming.emit('speak', 'hi');
lucy.emit('speak', 'I want a curry');
// var myEmitter = new events.EventEmitter();
// myEmitter.on('someEvent', function(message) {
// console.log(message);
// })
// myEmitter.emit('someEvent', 'the event was emitted');
读写文件(同步 异步)
var fs = require('fs');
var readMeOne = fs.readFile("readMe.txt", "utf8", function(err, data) {
var waitTill = new Date(new Date().getTime() + 2 * 1000);
while (waitTill > new Date()) {}
console.log("first async");
});
var readMeTwo = fs.readFile("readMe.txt", "utf8", function(err, data) {
var waitTill = new Date(new Date().getTime() + 2 * 1000);
while (waitTill > new Date()) {}
console.log("second async");
});
console.log("finished");
单线程运行 js 代码。
https://nodejs.org/dist/latest-v9.x/docs/api/fs.html#fs_fs_write_fd_string_position_encoding_callback
var fs = require('fs');
var readMe = fs.readFile("readMe.txt", "utf8", function(err, data) {
fs.writeFile('writeMe.txt', data, function() {
console.log('writeMe has finished');
})
});
// var waitTill = new Date(new Date().getTime() + 4 * 1000);
// while (waitTill > new Date()) {}
console.log("finished");
创建和删除目录
var fs = require('fs');
fs.mkdir('stuff', function() {
fs.readFile('readMe.txt', 'utf8', function(err, data) {
fs.writeFile('./stuff/writeMe.txt', data, function() {
console.log('copy successfully');
})
})
});
// fs.unlink("writeMe.txt", function() {
// console.log("delete writeMe.txt file");
// })
流和管道
注意
ls | grep app
这个命令在 linux 或 mac 才适合,或者 windows 的 git bash 也可以的。
如果是 windows 的命令提示符,对应的查找文件的命令应该是: dir | findstr app
// 解压
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');
var password = new Buffer(process.env.PASS || 'password');
var decryptStream = crypto.createDecipher('aes-256-cbc', password);
var gzip = zlib.createGunzip();
var readStream = fs.createReadStream(__dirname + '/out.gz');
readStream // reads current file
.pipe(gzip) // uncompresses
.pipe(decryptStream) // decrypts
.pipe(process.stdout) // writes to terminal
.on('finish', function() { // finished
console.log('done');
});
// 压缩
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');
var password = new Buffer(process.env.PASS || 'password');
var encryptStream = crypto.createCipher('aes-256-cbc', password);
var gzip = zlib.createGzip();
var readStream = fs.createReadStream(__dirname + "/readMe.txt"); // current file
var writeStream = fs.createWriteStream(__dirname + '/out.gz');
readStream // reads current file
.pipe(encryptStream) // encrypts
.pipe(gzip) // compresses
.pipe(writeStream) // writes to out file
.on('finish', function() { // all done
console.log('done');
});
// 流和管道
var fs = require('fs');
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt');
var myWriteStream = fs.createWriteStream(__dirname + '/writeMe.txt');
myReadStream.pipe(myWriteStream);
var writeData = "hello world";
myWriteStream.write(writeData);
myWriteStream.end();
myWriteStream.on('finish', function() {
console.log('finished');
})
myReadStream.setEncoding('utf8');
var data = ""
myReadStream.on('data', function(chunk) {
// data += chunk;
myWriteStream.write(chunk);
})
myReadStream.on('end', function() {
// console.log(data);
})
web服务器
//response.write 是可以写多个的。
//比如:
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
var http = require('http');
var onRequest = function(request, response) {
console.log('Request received');
response.writeHead(200, { 'Content-Type': 'text/plain' });
// response.write('Hello from out application');
response.end('Hello from out application');
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
响应json
JSON formatter 插件:https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=zh-CN
JSON.stringify: http://www.runoob.com/js/javascript-json-stringify.html
var http = require('http');
var onRequest = function(request, response) {
console.log('Request received');
response.writeHead(200, { 'Content-Type': 'application/json' });
// response.write('Hello from out application');
var myObj = {
name: "hfpp2012",
job: "programmer",
age: 27
};
response.end(JSON.stringify(myObj));
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
响应Html页面
var http = require('http');
var fs = require('fs');
var onRequest = function(request, response) {
console.log('Request received');
response.writeHead(200, { 'Content-Type': 'text/html' });
var myReadStream = fs.createReadStream(__dirname + '/index.html', 'utf8');
// response.write('Hello from out application');
myReadStream.pipe(response);
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
html字符串
'<!DOCTYPE html>' +
'<html lang="en">' +
'<head>' +
'<meta charset="UTF-8">' +
'<meta name="viewport" content="width=device-width, initial-scale=1.0">' +
'<meta http-equiv="X-UA-Compatible" content="ie=edge">' +
'<title>Document</title>' +
'</head>' +
'<body>' +
'</body>' +
'</html>'
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>hfpp2012</title>
</head>
<body>
hello wolrd
</body>
</html>
模块化
server.js
var http = require('http');
var fs = require('fs');
function startServer() {
var onRequest = function(request, response) {
console.log('Request received');
response.writeHead(200, { 'Content-Type': 'text/html' });
var myReadStream = fs.createReadStream(__dirname + '/index.html', 'utf8');
// response.write('Hello from out application');
myReadStream.pipe(response);
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
}
exports.startServer = startServer;
app.js
var server = require('./server');
server.startServer();
路由
server.js
var http = require('http');
var fs = require('fs');
function startServer() {
var onRequest = function(request, response) {
console.log('Request received ' + request.url);
if (request.url === '/' || request.url === '/home') {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/index.html', 'utf8').pipe(response);
} else if (request.url === '/review') {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/review.html', 'utf8').pipe(response);
} else if (request.url === '/api/v1/records') {
response.writeHead(200, { 'Content-Type': 'application/json' });
var jsonObj = {
name: "hfpp2012"
};
response.end(JSON.stringify(jsonObj));
} else {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/404.html', 'utf8').pipe(response);
}
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
}
exports.startServer = startServer;
review.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
review page
</body>
</html>
404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
404 error page
</body>
</html>
重构路由
app.js
var server = require('./server');
var router = require('./router');
var handler = require('./handler');
var handle = {};
handle["/"] = handler.home;
handle['/home'] = handler.home;
handle['/review'] = handler.review;
handle['/api/v1/records'] = handler.api_records;
server.startServer(router.route, handle);
server.js
var http = require('http');
var fs = require('fs');
function startServer(route, handle) {
var onRequest = function(request, response) {
console.log('Request received ' + request.url);
route(handle, request.url, response);
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
}
module.exports.startServer = startServer;
router.js
var fs = require('fs');
function route(handle, pathname, response) {
console.log('Routing a request for ' + pathname);
if (typeof handle[pathname] === 'function') {
handle[pathname](response);
} else {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/404.html', 'utf8').pipe(response);
}
}
module.exports.route = route;
handler.js
var fs = require('fs');
function home(response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/index.html', 'utf8').pipe(response);
}
function review(response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/review.html', 'utf8').pipe(response);
}
function api_records(response) {
response.writeHead(200, { 'Content-Type': 'application/json' });
var jsonObj = {
name: "hfpp2012"
};
response.end(JSON.stringify(jsonObj));
}
module.exports = {
home: home,
review: review,
api_records: api_records
}
使用GET或POST请求发送数据
server.js
https://nodejs.org/dist/latest-v9.x/docs/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
var http = require('http');
var fs = require('fs');
var url = require('url');
var querystring = require('querystring');
function startServer(route, handle) {
var onRequest = function(request, response) {
var pathname = url.parse(request.url).pathname;
console.log('Request received ' + pathname);
var data = [];
request.on("error", function(err) {
console.error(err);
}).on("data", function(chunk) {
data.push(chunk);
}).on('end', function() {
if (request.method === "POST") {
if (data.length > 1e6) {
request.connection.destroy();
}
data = Buffer.concat(data).toString();
route(handle, pathname, response, querystring.parse(data));
} else {
var params = url.parse(request.url, true).query;
route(handle, pathname, response, params);
}
});
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
}
module.exports.startServer = startServer;
handler.js
var fs = require('fs');
function home(response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/index.html', 'utf8').pipe(response);
}
function review(response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/review.html', 'utf8').pipe(response);
}
function api_records(response, params) {
response.writeHead(200, { 'Content-Type': 'application/json' });
response.end(JSON.stringify(params));
}
module.exports = {
home: home,
review: review,
api_records: api_records
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>hfpp2012</title>
</head>
<body>
<form action="/api/v1/records" method="post">
name: <input type="text" name="name" /> age: <input type="text" name="age" />
<input type="submit" value="Submit">
</form>
</body>
</html>