NodeJs 异常处理和内存泄漏处理

express() 表示创建express应用程序。简单几行代码其实就可以创建一个应用,如下:

案例一:异常处理,防止程序崩溃案例。

var express = require("express");//require用于在当前模块中加载和使用其他模块;

var app = express(); //创建express应用程序

//app.get(name),get()为获取设置项 name 的值
//express通过匹配请求路径,在做request、response操作
//第一个参数path为请求路径,第二个参数为处理请求的回调函数

匹配http://localhost:3000/hello做相关req,res的操作
app.get("/hello", function(req, res)){
	res.send("调用成功");
	//返回一个处理的结果字符串。
}

app.listen(3000) //在给定的端口和主机上监听请求,这个和node中http模块的http.createServer(function(){...}).listen()效果一致;


//防止服务器 崩溃的方式,用这种方式,用于处理在运行时我们没有发现的错误
process.on('uncaughtException',  function(err){
	console.log(err.stack)//把错误放在栈中
});

var a = "";
a.hello(); //hello未定义,正常程序会崩溃,但是先前增加了process.on,所以不会崩溃

正常我们会将前两句做异常判断
try{
	var a = "";
	a.hello();
}catch(e){
}

案例二:内存泄漏处理(非自动监听)

var express = require("express");
var app = express();
//因为要处理内存泄漏的问题,我们引入处理内存泄漏的模块
var MemoryLeakManager = require(“”MemoryLeakManager 所在的路径‘’)

class BigData{
	constructor(){
		this.data = "一个超级长的字符串";
	}
}

var buff = [];
//从监听窗口的网页中获取数据
//参数1:监听窗口路径是/hello
//参数2:回调函数,返回给客户端回调的结果:调用成功
app.get("/hello", function(req, res){
	for(var i=0; i<200000; i++){
		buff.push(new BigData())
	}
	res.send("调用成功");
});

app.listen(3000)//监听http://localhost:3000端口的行为

process.on("uncaughtException", function()err{
		console.log(err.stack)//把错误放在栈中
});

//异步处理,10000s后,如果主线程处理完,则执行队列中的setTimeout函数,如果主线程没处理完,则继续等主线程处理完在执行setTimeout函数(所以setTimeout函数可能会超过预定设置的时间10000s)
setTimeout(function(){
	//__dirname表示指向当前.js文件的全路径
	//将内存溢出的情况放在当前js路径下的Leak目录
	MemoryLeakManager .writeMemory(__dirname+"//Leak//")
}, 10000);

在Leak目录下生成的文件 可以进行调试

案例三:内存泄漏处理(自动监听)

var express = require("express");
var app = express();
var MemoryLeakManager = require(“”MemoryLeakManager 所在的路径‘’)

class BigData{
	construct(){
		this.data = "一个超级长的字符串";
	}
}

var buf = [];
//从监听窗口的网页中获取数据
//参数一:路径,监听端口路径
//参数二:回调函数,返回给监听端口的回调结果
app.get("/hello", function(req, res)){
	for(var i=0; i<20000; i++){
		buf.push(new BigData());
	}
	//返回给客户端回调结果
	res.send("调用成功");
}

//监听本地的 3000端口哦
app.listen(3000);

//防止服务器 崩溃的方式,用这种方式,用于处理在运行时我们没有发现的错误
process.on('uncaughtException',  function(err){
	console.log(err.stack)//把错误放在栈中
});


MemoryLeakManager.autoWatchMemory(__dirname+"//Leak//");

打开Leak目录下生成的文件 可以进行调试

//======================
js执行机制
js最大的特点就是单线程执行,所有的任务在执行的过程中都必须等待前一个任务执行完成才能执行.

js将任务分为两种:同步任务和异步任务,同步任务就是之前说后一个任务必须等待前一个任务执行完成才能执行,是在主线程上执行的,而异步任务不会直接进入主线程执行,而是进入任务队列,只有在任务队列通知异步任务可以执行时,才会被推入主线程执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Node.js 中正确使用 Socket 通信,需要处理异常和超时,以保证通信的可靠性和稳定性。 处理异常的方法如下: ```javascript const net = require('net') const client = new net.Socket() client.connect(8080, '127.0.0.1', () => { console.log('连接成功') }) client.on('data', (data) => { console.log(`接收到数据:${data}`) }) client.on('error', (err) => { console.error(`发生错误:${err}`) client.destroy() }) client.on('close', () => { console.log('连接关闭') }) ``` 在这个例子中,我们创建了一个 Socket 客户端,并连接到指定的服务器。然后我们监听了 `data`、`error` 和 `close` 事件。当 Socket 接收到数据时,会触发 `data` 事件;当 Socket 发生错误时,会触发 `error` 事件,我们需要在这个事件处理函数中调用 `client.destroy()` 方法来关闭 Socket 连接;当 Socket 连接关闭时,会触发 `close` 事件。 处理超时的方法如下: ```javascript const net = require('net') const client = new net.Socket() client.connect(8080, '127.0.0.1', () => { console.log('连接成功') }) client.setTimeout(5000) client.on('data', (data) => { console.log(`接收到数据:${data}`) }) client.on('error', (err) => { console.error(`发生错误:${err}`) client.destroy() }) client.on('timeout', () => { console.log('连接超时') client.destroy() }) client.on('close', () => { console.log('连接关闭') }) ``` 在这个例子中,我们在连接成功后,设置了 Socket 的超时时间为 5 秒。当超过超时时间时,会触发 `timeout` 事件,我们需要在这个事件处理函数中调用 `client.destroy()` 方法来关闭 Socket 连接。 需要注意的是,在使用 Socket 通信时,一定要注意异常和超时的处理,以避免因为网络问题导致通信失败或者长时间等待的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值