node.js - 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.js 应用程序崩溃了怎么办?你将如何确保它重新启动?流程管理器可以通过保持其正常运行来确保这一点。
PM2 是具有内置负载均衡器的 Node.js 应用程序的生产流程管理器。它允许您使应用程序永远保持活动状态,在不停机的情况下重新加载它们,并促进常见的系统管理任务。
希望这可以帮助。
推荐阅读
- c++ - 用 C++ 捕获传出的数据包
- hadoop - 如果我已经用 Ambari 安装了 Hadoop,我可以用 CDH 安装第二个 Hadoop 吗?在同一台机器上
- python - 以纳秒为单位的 CPU 时间 python - 使用已弃用的还是新的?
- laravel - 如何在服务器上安装 vue-cli?
- debugging - 使用 gdb 调试静态库
- c++ - What do cin and cout do when an ofstream file is opened?
- batch-file - 程序关闭后关闭的批处理文件
- odata - 从另一个 Odata 服务更新值
- mysql - MySQL sort query by matches from other tables
- angular - 如果 Angular 5 打字稿中不存在,则添加事件侦听器