使用express.js和PostgreSQL

时间:2015-08-23 07:32:26

标签: node.js postgresql rest express

我有一个脚本,其中包含从postgresql数据库获取数据并将其返回给客户端的rest apis。在开始时,脚本仅使用大约7mb的内存,并且在进行查询时响应时间非常快。但是,随着时间的推移(大约1天),脚本使用的内存会增加到170mb。现在,查询需要1分钟以上才能响应。但是当我重新启动脚本时,它的响应现在又快了。我无知为何会发生这种情况。任何人都可以对此有所了解吗?以下是我的脚本的一部分:

var port = process.env.PORT || 8000;
var router = express.Router();

router.get('/:id/from/:prevdate', function (req, res) {
    var results = [];
    var id = req.params.id;
    var prevdate = req.params.prevdate;

    pg.connect(connectionString, function (err, client, done) {
        var query = client.query("some sql statement here", [id, prevdate]);

        query.on('row', function (row) {
            results.push(row);
        });

        query.on('end', function () {
            client.end();
            return res.json(results);
        });
        if (err) {
            console.log(err);
        }
    });
});

router.get('/:id/getdata', function (req, res) {
    var results = [];
    var id = req.params.id;

    pg.connect(connectionString, function (err, client, done) {
        var query = client.query("some sql statement here", [id]);

        query.on('row', function (row) {
            results.push(row);
        });

        query.on('end', function () {
            client.end();
            return res.json(results);
        });

        if (err) {
            console.log(err);
        }
    });
});

app.use('/restapitest', router);
app.listen(port);
console.log('Webservice started using port: ' + port);

1 个答案:

答案 0 :(得分:0)

您正在混合connection pooling(使用done())与创建single connections(使用client.end())。

试试这个:

query.on('end', function() {
  done();
  return res.json(results);
});

此外,由于您无论如何都要将所有结果存储在内存中,因此无需使用事件。因此,通过适当的错误和连接处理,您可以使用:

pg.connect(connectionString, function (err, client, done) {
  var sendError = function(err) {
    console.log(err);
    return res.sendStatus(500);
  };

  if (err) return sendError(err);

  client.query("some sql statement here", [id, prevdate], function(err, results) {
    // Done with the client.
    done();

    // Handle any errors.
    if (err) return sendError(err);

    // Return result
    return res.json(results);
  });
});