Node基础

Node.js简介

1 什么是Node.js?

Node.js是运行在服务器端的JavaScript

Node.js 是一个基于Chrome JavaScript运行时建立的一个平台。

Node.js,是一个事件驱动IO服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

2.创建第一个应用

如果我们使用来编写后端的代码时,需要Apache或者Nginx的HTTP服务器,并配上mod php5模块和php-cgi。从这个角度看,整个"接收HTTP请求并提供Web页面的需求根本不需要PHP来处理。

不过对Node js来说,概念完全不一样了。使用Node.js时,我们不仅仅在实现一个应用,同时还实现了整个HTTP服务器。事实上,我们的web应用以及对应的 Web服务器基本上是一样的。

在我们创建Node.js应用时,需要经历三个步骤:引入required模块、创建服务器、接收请求与响应请求。

创建服务器

接下来我们使用http.createserver()方法创建服务器,并使用 listen方法绑定8888端口。函数通过request、response参数来接收和响应数据。

//创建服务器
http.createServe(function(request,response){
    
}).listen(8888);
console.log('server running at http://127.0.0.1:888/')

// 引入http模块
var http = require(`http`)
​
// 创建服务器
http.createServer(function(require,response){
    // 发送响应头
    response.writeHead(200,{'Content-Type':"text/plain"})
​
    // 输出响应内容
    response.write("hello world")
​
    response.end();
}).listen(8888)
​
​
console.log(`我的服务器,访问http://127.0.0.1:8888`);

3.模块系统

在你项目的根目录下创建—个叫server.js 的文件。

我们使用require指令来载入http模块,并将实例化的HTTP赋值给变量http,

创建模块实例如下:

hello.js:

exports.world = function(){
    console.log("hello world");
}

Node,js提供了exports和require两个对象,其中 exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象

main.js:

// 导入hello模块
var hello = require('./hello')
​
// 调用hello中的方法
hello.world()

hello.js 通过exports对象把 world 作为模块的访问接口,在main.js 中通过require(./hello')加载这个模块,然后就T以直接访问hello.js 中exports 对象的成员函数了。

4.URL模块

var url = require('url')
const reqUrl = 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash';
const urlObj= url.parse(reqUrl)
​
​
console.log(urlObj);
​
console.log(urlObj.protocol);
// 获取当前url的端口
console.log(urlObj.port);
// 获取主机
console.log(urlObj.host);
console.log(urlObj.auth);
console.log(urlObj.search);
// 获取查询参数
console.log(urlObj.query);
​
const urlObj2=url.parse(reqUrl,true)
console.log(urlObj2.query);
​
const reqUrl3 = "//foo/bar"
const reqUr1 = url.parse(reqUrl3,false)
console.log(reqUr1.host,reqUr1.pathname);
​
const   reqUr2 = url.parse(reqUrl3,false,true)
console.log(reqUr2.host,reqUr2.pathname);

5.路由

我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码。因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。

我们需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的NodeJS模块,它们分别是url和querystring模块。

index.js:

var server=require('./server')
var router=require('./route')
​
server.start(router.router)

route.js:

function router(pathname){
    console.log(`即将路由请求${pathname}`);
}
​
exports.router=router;

server.js:

// 获取服务器的地址和协议
var url = require("url");
var http=require("http");
​
function start(route){
        // 回调函数
            //参数OnRequest
    function OnRequest(request,response){
        let pathname = url.parse(request.url).pathname;
        console.log(`接收到${pathname}请求`);
​
        // 连接的是route.js的pathname
        route(pathname)
​
        response.writeHead(200,{'Cintent-Type':"text/plain"});
        response.write("Hello Node.js")
        response.end()
    }
        //         服务器OnRequest
    http.createServer(OnRequest).listen(8888)
    console.log("服务器已经启动......访问:http://127.0.0.1:8888");
}
​
module.exports={ 
    start
}

6.回调函数

Node.js 异步编程的直接体现就是回调。

回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数。

例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件U/O操作。这就大大提高了Node.js 的性能,可以处理大量的并发请求。

const fs = require("fs")
​
// 阻塞代码(同步)
// let data = fs.readFileSync('./index.txt')
// console.log(data.toString());
// console.log("成功");
​
​
// 非阻塞代码(异步)
​
// err失败
fs.readFile('./index.txt',function(err,data){
    if (err) {
        // error报错输出
        console.error(err.stack);
        return
    }
    console.log(data.toString());
})
​
console.log("成功");

7.事件循环

Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

Node.js的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

Node.js基本上所有的事件机制都是用设计模式中观察者模式实现。

Node,js单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。

事件驱动程序

Node.,js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式I0或者事件驱动IO)

在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

main.js

// 浏览器的事件驱动机制指的就是DOM元素的事件绑定,DOM元素的事件绑定分为了HTML级,DOM0级,DOM2级,其中DOM2级是最新实现
// addEventListner和removeEventListener
// DOM2级事件绑定,有两个关键的方法addEventListner(用于注册事件处理程序)和removeEventListener(用于解绑事件处理程序)
​
const events = require("events")
​
// 实例化EventEmitter对象
let eventEmitter = new events.EventEmitter();
eventEmitter.on("demo",function(){
    console.log("我是执行方法--demo");
})
​
// 触发事件
eventEmitter.emit("demo")
​
console.log("结束");

events.js

// 出发函数调用 emit:()
​
​
const events = require("events")
let eventEmitter = new events.EventEmitter();
​
// 定义事件
let connectionHandler = function(){
    console.log("连接成功");
​
    // 触发其他事件data_recived
    eventEmitter.emit("data_recived")
}
​
/ / 绑定connection事件
eventEmitter.on("connection",connectionHandler)
// 绑定data_recived事件k 
eventEmitter.on("data_recived",function(){
    console.log("数据接收成功");
})
​
// 触发connection事件
eventEmitter.emit("connection");
console.log("程序执行完毕");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值