服务端js Node.js

Node.js入门指南:特性、使用及Express框架
本文介绍了Node.js的特点,如事件驱动、非阻塞I/O和单线程,适合于大量并发简单应用程序I/O和实时交互应用程序。讲解了Node.js的简单使用,包括NPM、REPL、全局变量以及创建第一个应用。详细阐述了模块、函数、异步编程、事件和 EventEmitter。还探讨了http模块和fs模块,以及如何使用Express框架搭建Web应用,包括路由、静态文件处理和HTTP请求响应。

开始

Node.js是服务端的javascrip

Node.js特点

事件驱动:执行一个事件回调函数中途可以转而执行其他事件,然后返回原事件;
非阻塞I/O:访问数据库代码后可立即执行后面代码,把结果放在回调函数中;
单线程:减少内存开销,但错误出现整个应用会推出。

Node.js适用场景

  1. 大量并发简单应用程序I/O
  2. 与Web socket配合开发长连接实时交互应用程序 如:考试系统 博客 聊天室

Node.js简单使用

NPM

npm是捆在Node.js安装的包管理工具

Node.js REPL

Node.js REPL 是shell或终端

  • 启动REPL
node.js;
  • 下划线变量
    _下划线变量表示个表达式的运算结果

  • 退出
    Ctrl+C:退出此REPL行
    Ctrl+D = 连续两次Ctrl+C退出到普通命令行

  • 运行js文件

node xxx.js

Node.js 全局变量

  • __filename变量
console.log(__filename)    //返回路径
  • __dirname变量
console.log(__dirname)        //返回目录路径
  • setTimeout(函数,毫秒) clearsetTimeout(计时器)
setTimeout(hanshu,3000)   //三秒后执行hanshu事件一次
t = setTimeout(hanshu,3000);
clearTimeout(t);       //清除计时器
  • setInterval(函数,毫秒) 反复不停执行函数 clearInterval(计时器)

创建第一个应用

var pp = require("http");    //加载http模块
pp
	.createServer(function(request,response){
		response.writeHead(200,{"Content-Type":"text/plain"}); //发送头部 状态值200 内容
		response.end("Hello world\n");    //发送响应数据 ”Hello World"
	})
	.listen(8080)
node 文件名.js       //启动web服务

Node.js包和模块

package.json文件

包用来管理多个模块及其依赖关系,根目录必须有描述包的package.json文件,里面写名字版本号说明,搜索用的关键字等
package.json可以手写或者

npm init       //生成package.json文件
npm init --yes  //跳过问题生成默认的package.json文件

有package.json文件我们就能通过命令安装依赖

npm install     //安装所有依赖

包操作

安装包

npm install xxx包名

更新包

npm update xxx包名

删除包

npm uninstall xxx包名

包的名字全球唯一!

模块的使用

创建

function hanshu(){
	.....;
}        //创建函数
module.exports.hanshu = hanshu;     //提供导出

访问

var x = require("./js模块名");    //引入
x.hanshu();

Node.js函数

function hanshu(someFunction,value){
	someFunction(value);
	}              // 函数可以作为变量在另一个函数中传递
hanshu(someFunction,value1)       //使用实例

匿名函数

function(){
}

箭头函数(ES6新增)

可代替匿名函数,不可用在构造函数

(参数1,参数2...) =>{return表达式}  
 (参数1,参数2...)=>表达式单一
 (单一参数)=>{return..}
  单一参数=>{return..}
 ()=>{return..}

Node.js异步编程

非阻塞代码就是
程序开始加载文件后 然后直接去执行下面的代码了

Node.js事件

EvenEmitter

在模块events的方法

events.EventEmitter( )

添加监听器

emitter.on === emitter.addListener 完全一样

emitter.on("事件“,function(){
	console.log("已连接");
	});             //为事件添加计时器

把监听器置顶(这里用箭头函数代替了上面的匿名函数)

emitter.prependListener("事件",()=>console.log("随便是啥"));

当然也可以把回调函数赋值给变量

emitter.prependListener("事件",变量)

一次性监听器

emitter.once("事件”,.....)   //只能触发一次就注销
emitter.prependOneceListener()   //置顶

移除监听器

emitter.off === emtter.removeListener

emitter.off("事件",...//一次只能移除一个
emitter.removeAllListeners()   //All
emitter.removeAllListeners([事件name])
//指定名字的事件全部监听器

一旦事件触发,所有绑定的 监听器执行完才会执行移除事件

监听器数量控制

监听器最大绑定数
防止内存泄露,超过10个监听器就会警告

emitter.setMaxListeners(n)      //允许监听器个数
emitter.setMaxListeners(0或infinity) //不限制个数

查看绑定监视器个数

emitter.listenerCount(eventname)  //查看绑定监视器数

error事件

必须为error设置监听器,否则抛出相关信息会退出

var events = require("events");            //导入模块
var emitter = new events.EventEmitter();   //emitter对象
emitter.on("error",(err)=>{
	console.error("错误信息");    //设置监听器
});
emitter.emit("error");    //  $错误信息

http模块和fs模块

http模块

var http = require("http");   //  加载http模块
http
	.createServer(function(request,response){
		response.writeHead(200,{"Content-Type":"text/plain"});
		//发送http头   状态值200 内容类型:text/plain
		response.end("Hello World\n");
		})     //发送响应数据
		.listen(8080);
  • request请求对象 每次有请求都会触发
  1. request.url获 取请求路径,端口号之后的/开头的那一部分
  2. request.socket.localAddress 获取ip地址
  3. request.socket.remotePort 获取源端口


  • response响应对象 常用方法

1.向请求发送响应头

response.writeHead(
statusCode[,statusMessage][,headers])//只能调用一次
必须在end前调用

statusCode:状态码 200表示正常,404表示没找到 statusMessage:可选的 显示给用户的信息
headers:响应头 设置Content-Type 网页编码和文件类型 如: text/html:HTML格式
text/plain:纯文本格式



2.向用户发送响应数据 (文本或html代码)

 response.write()   //可使用多次 

最后用response.end()结束 不如客户端会一直等待


3.表示结束
response.end()   //每个响应都要结束

fs模块

导入require("fs")
异步打开文件fs.open(path,flags[,mode],callback);

  • mode:设置文件权限 默认0o666可读写
  • callback回调函数 callback(err,fd)
flags参数功能
”a“创建文件或追加内容
“r+”读取和追加
”w+“创建或截断 追加

异步关闭文件fs.close(fd,callback);

  • fd:fs.open()返回的文件描述符
    异步读取文件fs.read(fd,buffer,offset,length,position,callback);
  • fd:通过fs.open()返回的文件描述符 buffer:数据写入的缓冲区
  • offset:缓冲区开始写入的偏移量 一般为0
  • length:指定读取的字节书 整数
  • position:文件开始读取的位置, position为null则从当前位置读取,并更新文件位置
  • callback:回调函数 (err,bytesRead,buffer)

异步写入文件 fs.write(fd,buffer,offset,length,position,callback)

  • offset:指定要写入的buffer部分

  • position:写入开头偏移量 typeof position !== 'number' 时从当前位置写入数据

异步获取文件信息 fs.stat(path,callback)
异步截取文件 fs.ftruncate(fd[,len],callback);

  • len:文件内容截取长度,默认为0

异步删除文件 fs.unlink(path,callback);
修改文件名 fs.rename(oldPath,newPath,callback);
异步创建目录 fs.mkdir(path[,options],callback);
options:
recursive是否以递归方式创建目录 默认false
mode设置目录权限 默认0o777
异步读取目录 fs.readdir(path[,options],callback);
options:encoding 默认 ‘utf8’
withFileTypes 默认false
异步删除目录 fs.rmdr(path,callback);

Express框架

Express是Node.js的 Web框架,用来搭建一个完整功能的网站。

安装

npm install express

路由

确定应用程序如何响应客户端请求

app.method(path,handler)
  • app:是Express的实例
  • method:HTTP请求方法(GET,POS等)
  • path:服务器上的路径
  • handler:路由匹配时执行的函数

静态文件

var app = express();
app.use(express.static("public"))   
  • public:图片 CSS Javascript 等静态文件所在目录

GET请求和POST请求


...........![在这里插入图片描述](https://img-blog.csdnimg.cn/2020060521365060.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B5dGhvbmFu,size_16,color_FFFFFF,t_70#pic_center)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值