Nodejs做的网站,由于一些异常,程序老是退出
Nodejs做的网站,由于一些异常,程序老是退出
node做的网站,由于一些异常,程序老是退出,怎么处理呢? 而且退出后session都没了,
当使用 Node.js 构建网站时,如果遇到异常导致程序频繁退出,这通常是因为未正确处理错误。Node.js 是一个非阻塞、事件驱动的环境,因此需要特别注意错误处理机制,以确保应用程序的稳定性和持久性。
常见原因及解决方法
-
未捕获的异常
- 问题:如果一个异步操作(如数据库查询或网络请求)抛出异常且未被捕获,Node.js 会认为这是一个致命错误并退出进程。
- 解决方案:使用全局错误处理机制来捕获这些异常。
process.on('uncaughtException', (err) => { console.error('Uncaught Exception:', err); // 可以在这里添加日志记录逻辑 // 进程退出前的操作 process.exit(1); });
-
HTTP 错误处理
- 问题:HTTP 请求或响应中的错误也可能导致程序退出。
- 解决方案:确保在处理 HTTP 请求和响应时添加适当的错误处理。
const http = require('http'); http.createServer((req, res) => { try { // 处理请求 res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); } catch (error) { console.error('Request processing error:', error); res.writeHead(500, {'Content-Type': 'text/plain'}); res.end('Internal Server Error\n'); } }).listen(3000);
-
Session 管理
- 问题:如果你使用的是内存存储的 session(例如使用 express-session),当进程重启时,所有 session 数据都会丢失。
- 解决方案:使用持久化存储(如 Redis)来存储 session 数据。
const session = require('express-session'); const RedisStore = require('connect-redis')(session); app.use(session({ store: new RedisStore(), secret: 'your-secret-key', resave: false, saveUninitialized: false }));
示例代码
以下是一个简单的 Express 应用程序示例,展示了如何处理错误和使用持久化 session 存储:
const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const http = require('http');
// 创建应用实例
const app = express();
// 设置 session 中间件
app.use(session({
store: new RedisStore(),
secret: 'your-secret-key',
resave: false,
saveUninitialized: false
}));
// 全局错误处理中间件
app.use((err, req, res, next) => {
console.error('Error:', err);
res.status(500).send('Something went wrong.');
});
// 路由处理
app.get('/', (req, res) => {
req.session.views = (req.session.views || 0) + 1;
res.send(`You visited this page ${req.session.views} times`);
});
// 启动服务器
http.createServer(app).listen(3000, () => {
console.log('Server running on port 3000');
});
通过上述方法,你可以提高 Node.js 应用程序的健壮性,并确保即使在发生异常时也能保持运行。
pm2,session持久化
同上 部署用pm2,会自动重启进程 session持久化存储
用mongoStore存session吧
process.on('uncaughtException',function(err){
console.log('uncaughtException-->'+err.stack+'--'+new Date().toLocaleDateString()+'-'+new Date().toLocaleTimeString());
process.exit();
});
查看一下未被捕捉的错误
var domain = require('domain');
var catchError=domain.create();
catchError.on('error', function(e) {
console.log("applicationException-->"+ e.stack+'--'+new Date().toLocaleDateString()+'-'+new Date().toLocaleTimeString());
});
异步错误捕获
关键是什么异常?发出来看看
当使用 Node.js 开发网站时,如果程序因为某些异常而频繁退出,可以采取以下措施来确保程序的稳定性和持久性。主要问题可能出现在未捕获的异常或者未处理的 Promise 拒绝上。
1. 全局错误处理
Node.js 中可以通过监听 uncaughtException
事件来捕获未被捕获的异常,防止程序意外退出。但是,这并不是推荐的做法,因为它可能会掩盖程序中的严重问题。更好的做法是修复这些异常,但在某些情况下,它可以用来保持服务器的运行状态:
process.on('uncaughtException', (err) => {
console.error(`Caught exception: ${err}`);
});
2. 使用集群
通过使用 Node.js 的 cluster
模块,可以创建多个工作进程,每个进程独立处理请求,从而提高系统的稳定性和可靠性。如果一个进程崩溃,其他进程仍然可以继续运行。
const cluster = require('cluster');
const http = require('http');
if (cluster.isMaster) {
// 创建多个子进程
for (let i = 0; i < require('os').cpus().length; i++) {
cluster.fork();
}
} else {
// 子进程运行 HTTP 服务器
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000);
}
3. 处理未处理的 Promise 拒绝
使用 process.on('unhandledRejection')
来处理未处理的 Promise 拒绝。这可以防止 Node.js 因为未处理的 Promise 拒绝而退出。
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', reason.stack || reason, 'Promise:', promise);
});
4. 使用 session 中间件
如果你正在使用 Express.js,并且希望即使程序重新启动后仍然保留用户的 session,可以考虑将 session 存储在外部存储(如 Redis 或数据库)中,而不是默认的内存存储。
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
app.use(session({
store: new RedisStore({ /* Redis 配置 */ }),
secret: 'your-secret',
saveUninitialized: false,
resave: false
}));
总结
确保你的应用能够优雅地处理异常,并使用外部存储来持久化 session 数据,可以大大提高 Node.js 应用的可靠性和稳定性。同时,建议使用适当的错误日志记录机制,以便于后续排查问题。