Nodejs做的网站,由于一些异常,程序老是退出

Nodejs做的网站,由于一些异常,程序老是退出

node做的网站,由于一些异常,程序老是退出,怎么处理呢? 而且退出后session都没了,

7 回复

当使用 Node.js 构建网站时,如果遇到异常导致程序频繁退出,这通常是因为未正确处理错误。Node.js 是一个非阻塞、事件驱动的环境,因此需要特别注意错误处理机制,以确保应用程序的稳定性和持久性。

常见原因及解决方法

  1. 未捕获的异常

    • 问题:如果一个异步操作(如数据库查询或网络请求)抛出异常且未被捕获,Node.js 会认为这是一个致命错误并退出进程。
    • 解决方案:使用全局错误处理机制来捕获这些异常。
    process.on('uncaughtException', (err) => {
        console.error('Uncaught Exception:', err);
        // 可以在这里添加日志记录逻辑
        // 进程退出前的操作
        process.exit(1);
    });
    
  2. 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);
    
  3. 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 应用的可靠性和稳定性。同时,建议使用适当的错误日志记录机制,以便于后续排查问题。

回到顶部