Node.js 学习笔记(一)
node.js说白了就是JavaScript。
node.js的性能是php的86倍(大概)。
在下载完后可以用命令行打开及运行。
什么是 Web 服务器?
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL,与客户端的网络浏览器配合。
大多数 web 服务器都支持服务端的脚本语言(php、python、ruby)等,并通过脚本语言从数据库获取数据,将结果返回给客户端浏览器。
目前最主流的三个Web服务器是Apache、Nginx、IIS。
Web 应用架构
Client - 客户端,一般指浏览器,浏览器可以通过 HTTP 协议向服务器请求数据。
Server - 服务端,一般指 Web 服务器,可以接收客户端请求,并向客户端发送响应数据。
Business - 业务层, 通过 Web 服务器处理应用程序,如与数据库交互,逻辑运算,调用外部程序等。
Data - 数据层,一般由数据库组成。
web模块:http
代码示例:
const http=require('http'); var server=http.createServer(function(req,res){ //req----require是请求,res----respond是回应 console.log("访问了一次");//这里改为("req.url")可以返回访问的网址 res.write("在页面上显示文字"); res.end(); }); server.listen(8080);//监听,括号里为本地端口号,一台服务器可能同时对外提供很多种服务,端口是代表访问服务器里哪种服务的一串数字。 这里的地址为localhost:8080.
//用谷歌浏览器返回网址的时候会连带返回/favion.ico这是选项卡默认的小图标
//可以在createServer里用switch控制不同访问网址打开的界面。
文件系统:fs
var fs=require("fs");
fs模块中的方法均有同步和异步版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync()。
异步方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议使用异步,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
实例:
创建一个index.html文件,内容为
<p>www.nodeJs.com</p>
创建file.js文件,代码如下:
var fs= requeir("fs"); //异步读取 fs.readFile("index.html",function(err,data){ if(err){ return console.error(err); } console.log("异步读取:"+data.toString());//这里如果不加 toString() 会显示一堆二进制 }); //同步读取 var data =fs.readFileSync('index.html'); console.log("同步读取:"+data.toString()); console.log("程序执行完毕。");
以上代码执行结果入下:
同步读取:www.nodeJs.com 程序执行完毕。//注意这里是程序先执行完毕 异步读取:www.nodeJs.com
示例:
const http=require('http');
const fs=require('fs');
var server=http.createServer(function(req,res){
//文件的路径 req.url=>'/index.html'
//将文件都放在一个叫‘www’的文件夹里读取文件只要=>'./www'+req.url;
var file_name='./www'+req.url;
fs.readFile(file_name,function(err,data){
if(err){
res.write('404');
}else{
res.wirte(data);
}
res.end() //注意这玩意的摆放位置
});
});
server.listen(8080);
请求方式----get(数据在url中)
html代码:
<form action="http://localhost:8080/aaa" method="get"> 用户:<input type="text" name="user" value="" /><br /> 密码:<input type="password" name="pass" value="" /><br /> <input type="submit" value="提交" /> </form> node.js代码: var http=require('http'); http.createServer(function(req,res){ console.log(req.url); res.write('submit success'); res.end(); }).listen(8080);
输入后获得数据,?前面为请求地址,后面为请求数据。
字符串切割方式 1
var http = require('http'); http.createServer(function(req, res) { var GET = {}; if (req.url.indexOf('?')!=-1){ var arr = req.url.split('?'); var url = arr[0]; //arr[0]=>地址 '/aaa' //arr[1]=>数据 'user=xuhuihong&pass=123456' var arr2 = arr[1].split('&'); //arr2=>['user=blue','pass=123456'] for (var i = 0; i < arr2.length; i++) { var arr3 = arr2[i].split('='); //arr3[0]=>名字 'user' //arr3[1]=>数据 'blue' GET[arr3[0]] = arr3[1]; //键值对 } }else { var url = req.url; } console.log(url, GET); res.write('submit success'); res.end(); }).listen(8080);
字符串切割方式 2
var http = require('http'); const querystring = require('querystring'); http.createServer(function(req, res) { var GET = {}; if (req.url.indexOf('?')!=-1){ var arr = req.url.split('?'); var url = arr[0]; GET=querystring.parse(arr[1]); }else { var url = req.url; } console.log(url, GET); res.write('submit success'); res.end(); }).listen(8080);
字符串切割3 ----url模块
示例:
nodejs代码 const urlLib=require('url'); var obj=urlLib.parse('https://www.bilibili.com/index?a=55&b=6600'); console.log(obj);
结果
Url { protocol: 'https:', slashes: true, auth: null, host: 'www.bilibili.com', port: null, hostname: 'www.bilibili.com', hash: null, search: '?a=55&b=6600', query: 'a=55&b=6600', pathname: '/index', path: '/index?a=55&b=6600', href: 'https://www.bilibili.com/index?a=55&b=6600' }
如果在parse中加入参数true,query部分会被解析
var obj=urlLib.parse('https://www.bilibili.com/index?a=55&b=6600',true);
query: { a: '55', b: '6600' },
切割示例:
var http = require('http'); const urlLib=require('url'); http.createServer(function(req, res) { var obj=urlLib.parse(req.url,true); var url=obj.pathname; var GET=obj.query; console.log(url, GET); res.write('submit success'); res.end(); }).listen(8080);
请求方式----post(数据在文件体中)
get数据的大小最大为32k
post数据最大为1G,因此post数据的发送方式为分段发送。
用form提交的post数据没有url。
示例:
const http = require('http'); const querystring=require('querystring'); http.createServer(function(req, res) { //post--req var str="";//接受数据 //data--有一段数据到达(很多次) var i=0; req.on('data',function(data){ console.log('第${i++}次收到数据'); str+=data; }); //end-数据全部到达(一次) req.on('end',function(){ var POST=querystring.parse(str); console.log(str); }); }).listen(8080);
结果
user=qqqqqq&pass=aaaaaaaaa
综合示例:
const http=require('http'); const fs=require('fs'); const queryString=require('querystring'); const urlLib=require('url'); var server = http.createServer(function(req,res){ //GET var obj=urlLib.parse(req.url,true); var url=obj.pathname; const GET=obj.query; //POST var str=''; req.on('data',function(data){ str+=data; }); req.on('end',function(){ var POST=queryString.parse(str); /* url--要什么 GET--get数据 POST--post数据 */ console.log(url,GET,POST); //文件请求 var file_name='./www'+url; //这里url要输完后缀 fs.readFile(file_name,function(err,data){ if(err){ res.write('404'); }else{ res.write(data); } res.end(); }); }); }); server.listen(8080);
结果:
post方式:/aaa {} { user: 'aaaaa', pass: 'dddddd' }
get方式:/aaa { user: 'aaaaaa', pass: 'dddddddddd' } {}