首页 > 解决方案 > nodejs express 几天后停止工作

问题描述

使用 NodeJS 和 Express 设置网站后,它可以正常工作几天,但随后停止工作。停止工作意味着当我们向后端发送 post 请求或 get 请求时,什么也没有发生。发送表单后,有一个会话要设置,然后重定向到其他页面,但它保持在同一页面上。我使用 express-session 和 MemoryStor。npm 或节点控制台中没有日志或错误。

应用程序.js:

import debug = require('debug');
import express = require('express');
import path = require('path');
import routes from './routes/index';
import test1 from './routes/test1';
import test2 from './routes/test2';
import test3 from './routes/test3';
import helmet = require('helmet');

var app = express();
var bodyParser = require('body-parser');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var MemoryStore = require('memorystore')(session);
var device = require('express-device');
var compression = require('compression');

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json());       // to support JSON-encoded bodies
app.use(device.capture({ parseUserAgent: true }));
app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded({ extended: true })); // to support URL-encoded bodies
app.use(cookieParser());
app.use(compression());
app.use(helmet());
app.set('trust proxy', 1);

app.use(session({
    secret: 'test',
    resave: false,
    store: new MemoryStore({
        checkPeriod: 86400000 // prune expired entries every 24h
    }),
    saveUninitialized: true,
    cookie: {
        secure: false, //for https
        maxAge: 60000,
        expires: new Date(Date.now() + (604800000)) //7
    }
}));

Array.prototype.unique = function () {
    var a = this.concat();
    for (var i = 0; i < a.length; ++i) {
        for (var j = i + 1; j < a.length; ++j) {
            if (a[i].id === a[j].id)
                a.splice(j--, 1);
        }
    }

    return a;
};
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes); // 404 error for this line
app.use('/test1', test1);
app.use('/test2', test2);
app.use('/test3', test3);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err['status'] = 404;
    next(err);
});
app.use((req, res, next) => {
    const oldRedirect = res.redirect;
    res.redirect = function (...args) {
        if (req.session) {
            req.session.save(() => Reflect.apply(oldRedirect, this, args));
        } else {
            Reflect.apply(oldRedirect, this, args);
        }
    }
});
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use((err: any, req, res, next) => {
        res.status(err['status'] || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use((err: any, req, res, next) => {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function () {
    debug('Express server listening on port ' + server.address().port);
});

标签: node.jsexpress

解决方案


您可能需要使用流程管理器。如果 Node.js 应用程序崩溃了怎么办?你将如何确保它重新启动?流程管理器可以通过保持其正常运行来确保这一点。

PM2 是具有内置负载均衡器的 Node.js 应用程序的生产流程管理器。它允许您使应用程序永远保持活动状态,在不停机的情况下重新加载它们,并促进常见的系统管理任务。

希望这可以帮助。


推荐阅读