【问题标题】:Nodejs with express stop responding request after some time working工作一段时间后具有快速停止响应请求的Nodejs
【发布时间】:2017-06-25 07:24:24
【问题描述】:

我的服务器正在运行,但运行一段时间后它停止响应请求,继续尝试加载页面让我无法建立连接。

我的 app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var oracledb = require('oracledb');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var multer = require('multer');
var fileUpload = require('express-fileupload');
var sessionStore;
var app = express();

var oracleDbStore = require('express-oracle-session')(session);

var connect = require(path.join(__dirname, 'connection', 'conn'))(2);

oracledb.createPool(connect, function(err, pool) {
      if (err) {
        console.error("createPool() error: " + err.message);
        return;
            }
            pool.getConnection(function(err, connection) {
                if (err) {
                    handleError(response, "getConnection() error", err);
                    return;
                }
                var diffopt = {externalAuth: true,
                            checkExpirationInterval: 900000,
                            expiration: 86400000,
                            createDatabaseTable: true,
                            connectionLimit: 1,
                            schema: {
                                tableName: 'sessions',
                                columnNames: {
                                    session_id: 'session_id',
                                    expires: 'expires',
                                    data: 'data'
                                }
                            }};
                var options = Object.assign({},connect,diffopt);
                sessionStore = new oracleDbStore(options, connection);
            });
        });

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'twig');

// uncomment after placing your favicon in /public
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(fileUpload());
app.use(cookieParser());
app.use('/files',express.static(path.join(__dirname, 'public')));
app.use('/archivos',express.static(path.join(__dirname, 'archivos')));
app.set('trust proxy', 1);
app.use(session({
    secret: "work",
    name: 'sessionId',
    store:sessionStore,
    resave: false,
    saveUninitialized: false
}));

var links = require('./links');

for(var i=0;i<links.length;i++){
    app.use(links[i].route, require(links[i].direction));
}

app.get('*',function(req,res){
    res.redirect('/');
});

app.get('/', function(req, res){
  res.sendFile(path.join(__dirname, 'views/index.twig'));
});

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

服务器停止响应但仍收到请求时的日志。它不能加载任何视图或静态文件。

GET /files/stylesheets/jquery-ui.css - - ms - -
GET /files/jscript/jquery.min.js - - ms - -
GET /files/stylesheets/font-awesome.min.css - - ms - -
GET /files/stylesheets/style.css - - ms - -
GET /files/stylesheets/AdminLTE.css - - ms - -
GET /files/stylesheets/bootstrap.min.css - - ms - -
GET / 304 2.676 ms - -
GET /files/stylesheets/AdminLTE.css - - ms - -
GET /files/stylesheets/style.css - - ms - -
GET /files/stylesheets/font-awesome.min.css - - ms - -
GET /files/stylesheets/bootstrap.min.css - - ms - -
GET /files/stylesheets/jquery-ui.css - - ms - -
GET / 304 2.759 ms - -
GET /files/stylesheets/jquery-ui.css - - ms - -
GET /files/jscript/jquery.min.js - - ms - -
GET /files/stylesheets/bootstrap.min.css - - ms - -
GET /files/stylesheets/font-awesome.min.css - - ms - -
GET /files/stylesheets/AdminLTE.css - - ms - -
GET /files/stylesheets/style.css - - ms - -
GET /login 200 1.157 ms - 1417
GET /files/imagenes/up.jpeg - - ms - -
GET /files/stylesheets/bootstrap.min.css - - ms - -
GET /files/stylesheets/bootstrap.min.css - - ms - -
POST /login - - ms - -

最后我需要重新启动服务器才能让它再次工作。

【问题讨论】:

  • 我怀疑,由于您根本无法建立连接,因此该进程正在终止。除非您的资源用完了,否则这可能是由于未处理的异常。我的建议是使用它,弄清楚如何让它随意中断,然后加强故障点周围的错误日志记录,以便您可以调试它。
  • 同样的建议,通过使用 try catch 来解决它,并找出我们的服务器退出的位置。
  • 我猜你没有释放某种数据库资源,最终你用完了资源。

标签: javascript node.js express express-session


【解决方案1】:

感谢您的回复,问题是 oracledb 池,当它过期时会挂起服务器。我将其更改为 express-file-store,现在它可以正常工作了。

app.use(session({
    store: new FileStore(options),
    secret: "work",
    name: 'sessionId',
    resave: true,
    saveUninitialized: false
}));

【讨论】:

  • 您的会话池可能大于 node-oracledb 可用的线程数。请参阅文档中的连接和线程数 [github.com/oracle/node-oracledb/blob/v1.12.2/doc/…。它指出每个连接都会阻塞一个线程。您应该在启动 Node.js 之前增加 UV_THREADPOOL_SIZE。与外部池相比,node-oracledb 会话池具有一些优势,尤其是在负载平衡和死连接检测方面。
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多