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文件,内容为
创建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' } {}
原文地址:https://www.cnblogs.com/BlackFungus/p/9129517.html