Node学习笔记day1

本文是Node.js学习笔记的第一天,介绍了Node.js的基本概念,它是一个JavaScript运行时环境,提供服务器级别的API。内容包括:Node.js的特性如事件驱动、非阻塞IO模型,以及如何用Node构建Web服务器、处理错误、使用核心模块,如文件操作、http服务、IP地址和端口号等。此外,还讨论了响应内容类型和模块系统的重要性。
摘要由CSDN通过智能技术生成

什么是Node.js

  • Node.js不是一门语言,不是库、不是框架,是一个JavaScript运行时环境,一个平台;简单说Node.js可以解析和执行JavaScript代码。
  • Node.js中的JavaScript没有DOM、BOM,只有EcmaScript(基本的语法),在Node这个JavaScript执行环境中为JavaScript提供了一些服务器级别的操作API,例如文件读写,网络服务的构建,网络的通信,http服务器等
  • Node.js特性:事件驱动、非阻塞IO模型(异步);
  • npm是世界上最大的开源库生态系统,绝大多数JavaScript相关包都存放在了npm上,这样左的目的是为了让开发人员更方便的去下载使用;

Node.js能做什么

  • Web服务器后台
  • 命令行工具
  1. npm(node)
  2. git(c语言)
  3. hexo(node)…

Node中简单的错误处理

//fs是flie-system的简写,就是文件系统的意思;
//1.用require方法加载fs核心模块
var fs = require('fs');
//2.读取文件,两个参数分别为读取文件的路径和回调函数
//回调函数的两个参数
//  成功  data为数据  error为null  
//  失败  data为undefind  error为错误对象  
fs.readFile('./data/a.txt', function (error, data) {
    // console.log(data);
    // console.log(data.toString());
    // console.log(error);
    // console.log(data);
    if(error){
        console.log('读取文件失败');
    }else{
        console.log(data.toString());
    }
});

用Node构建一个服务器

//Node中专门提供了一个核心模块:http
//http这个模块的职责就是帮你创建编写服务器的


//1.加载http核心模块
var http = require('http');

//2.使用http.createServer()方法创建一个Web服务器
//返回一个Server实例
var sever = http.createServer();

//3.服务器要干嘛?接受发出的请求,处理请求,给个反馈(发送响应)
//注册request请求事件,当客户端请求发送过来,就会自动触发服务器的request请求事件,
//然后执行第二个参数,回调处理函数
sever.on('request',function(){
    console.log('收到客户端请求');
    
});

//4.绑定端口号,启动服务器
sever.listen(3000,function(){
    console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/来访问');
    
});

var http = require('http');
var sever = http.createServer();

//request 请求事件处理函数,需要接收两个参数
//Request 请求对象,请求对象可以用来获取客户端的一些请求信息,例如请求路径
//Response 响应对象,响应对象可以用来给客户端发送响应消息
sever.on('request', function (request, response) {
    console.log('收到客户端请求,请求路径是:' + request.url);
    //response对象有一个方法:wirte可以用来给客户发送响应数据
    //wirte可以多次使用,但最后一次一定要使用end来结束响应,否则客户端会一直等待
    response.write('hello');
    response.write('node.js');
    //结束响应,告诉客户端响应完毕,可以呈递给用户了
    response.end();

});

sever.listen(3000, function () {
    console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/来访问');
});

  • 响应内容只能是二进制数字或者字符串;

Node中的js核心模块

  • EcmaScript:没有BOM和DOM;
  • 核心模块
  • Node为Javascript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了。
  • 例如文件操作的fs核心模块,http服务构建的http模块,path路径操作模块,os操作系统信息模块…
  • 注意:以后只要是核心模块,就必须操作如下:
var fs = require('fs');
var http = require('http');
  • Node中的模块系统

  • 相对路径必须加./

//可以
require('./b.js');
//推荐:可以省略后缀名
require('./b);
//require是一个方法
//它的作用是用来加载模块的
//在node中模块有三种:
//1.具名的核心模块,例如fs,http
//2.用户自己编写的文件模块
var foo = 'aaa';
console.log('开始执行a.js文件');
//相对路径必须加./
require('./b.js');
console.log('a.js文件执行结束');
console.log(foo);
//在node中没有全局作用域,只有模块作用域,或者叫文件作用域,超出本文件都无效;
///外部访问不到内部,内部也访问不到外部;
var foo = 'bbb';
console.log('b start');
require('./c.js');
console.log('b end');

console.log('ccc');

PS E:\1前端视频\前后端交互阶段\nodejs总结\day1\07-简单的模块化> node a.js
开始执行a.js文件
b start
ccc
b end
a.js文件执行结束
aaa
  • 加载与导出
//require方法有两个作用:
//1.加载文件模块并执行里面的代码
//2.拿到被加载文件模块导出的接口对象

//在每个文件模块中都提供了一个对象:exportss
//exports  默认是一个空对象{}
var bExports = require('./b.js');
// console.log(foo);;
console.log(bExports);
console.log(bExports.foo);
console.log(bExports.add(10,20));
var foo = 'bbb';

exports.foo = 'hello';

exports.add = function (x, y) {
    return x + y;
}
PS E:\1前端视频\前后端交互阶段\nodejs总结\day1\07-简单的模块化\加载与导出> node a.js
{ foo: 'hello', add: [Function (anonymous)] }
hello
30

IP地址和端口号

  • IP地址用来定位计算机
  • 所有的联网的程序都需要进行网络通信,计算机中只有一个物理网卡,而且同一个局域网中,网卡的地址必须唯一,网卡是通过 唯一的IP地址来定位的;
  • 端口号是用来定位具体应用程序的
  • 所有需要联网通信的软件都必须具有端口号;
  • 端口号的范围0-65536之间;
  • 在计算机中有一些默认的端口号,最好不要用,比如http服务的80;
  • 我们在开发过程中使用一些简单好记的就可以了,例如3000、5000等没什么含义的;
  • 可以同时开启多个服务,但是要保证不同服务占用不同的端口号;
// ip 地址用来定位计算机
// 端口号用来定位具体的应用程序
// 所有需要联网通信的应用程序都会占用一个端口号

var http = require('http')

var server = http.createServer()

// 2. 监听 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {
  console.log('收到请求了,请求路径是:' + req.url)
  console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort)

  res.end('hello nodejs')
})

server.listen(5000, function () {
  console.log('服务器启动成功,可以访问了。。。')
})

响应内容类型

  • 在http协议中,Content-Type就是用来告知对方,我给你发送的数据内容是什么类型;
  • 在线查询Content-Type的网址http://tool.oschina.net/commons
//一个简单web服务
//1.创建server
var http = require('http');
var server = http.createServer();
//2.监听request请求事件,设置请求处理函数
server.on('request', function (req, res) {
    //在服务端默认发送的数据是utf8编码内容,但浏览器会按照当前操作系统默认编码去解析
    //中文操作系统是gbk,解决方法就是告诉浏览器发送内容为什么编码
    // res.setHeader('Content-Type', 'text/plain;charset=utf-8');
    // res.end('hello 事件');
    var url = req.url;
    //text/plain就是普通文本
    if (url === '/plain') {
        res.setHeader('Content-Type', 'text/plain;charset=utf-8');
        res.end('hello 事件');
    } else if (url === '/html') {
        //text/html是html的文本
        res.setHeader('Content-Type', 'text/html;charset=utf-8');
        res.end('<p>hello html <a href="">点我</a></p>');
    }
});

server.listen(3000, function () {
    console.log('Server is running...');

}); 

在这里插入图片描述

在这里插入图片描述

if (url === '/plain') {
        res.setHeader('Content-Type', 'text/plain;charset=utf-8');
        res.end('hello 事件');
    } else if (url === '/html') {
        //text/html是html的文本
        res.setHeader('Content-Type', 'text/plain;charset=utf-8');
        res.end('<p>hello html <a href="">点我</a></p>');
    }

在这里插入图片描述

总结

  • 模块系统,在Node中没有全局作用域的概念;
  • 在Node中只能通过require方法来加载执行多个JavaScript脚本文件;
  • require加载中只能执行文件中的代码,文件与文件之间由于模块作用域,所以不会有污染的问题;
  1. 模块是完全封闭的;
  2. 外部无法访问内部;
  3. 内部也无法访问外部;
  • 但是某些情况下,模块与模块是需要进行通信的,每个模块中都提供了一个对象:exports,默认是一个空对象;
  • 把被需要被外部访问使用的成员手动加载到exports接口对象中,然后谁require这个模块就会得到exports接口对象
  • 核心模块:是由Node提供一个个的具名的模块,它们都有自己特殊的名称标识,例如:
  1. fs文件操作模块
  2. http网络服务构建模块
  3. os操作系统信息模块
  4. path路径处理模块…
  • 所有核心模块在使用时都必须先手动使用require方法来加载,然后才可以使用,例如
var fs = require('fs');
  • IP是用来定位计算机的,端口号是用来定位具体的应用程序;
  • Content-Type:服务器最好每次响应的数据是什么内容类型都告诉客户端,而且要正确的告诉;
  • 不同的资源对应的Content-Type是不一样的,具体参照http://tool.oschina.net/commons
  • 对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题;
  • 通过网络发送文件:
  1. 发送的并不是文件,本质是来讲发送的是文件的内容;
  2. 当浏览器收到服务器的响应内容之后,就会根据你的Content-Type进行对应的解析处理;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值