2017-06-17 2 views
0

Kürzlich habe ich eine Rest API mit Nodejs, Express, https und MySQL zur Produktion entwickelt. Das funktioniert gut, aber nach zwei bis drei Tagen habe ich mich beschwert, dass der Server nicht antwortet und die meiste Zeit die Zeit abläuft.Node.js Server antwortet nicht nach bestimmten Anfragen

Grundsätzlich nach einer bestimmten Anzahl von Quests reagiert meine node.js App nicht mehr auf Anfragen.Ich sehe sogar, dass Routen auf meiner Konsole ausgelöst werden und die HTTP-Aufrufe von meinem Client (Android App) den Server alle erreichen. Aber danach Starten Sie meinen node.js-App-Server neu, alles funktioniert wieder, bis die unvermeidlichen Dinge wieder aufhören. Die App stürzt nie ab, sie reagiert nicht mehr auf Anfragen.

Ich bekomme keine Fehler, und ich habe sichergestellt, dass alle DB-Verbindungsfehler zu behandeln und zu protokollieren, so dass ich nicht sicher bin, wo ich anfangen soll.

Mein Datenbank-Verbindungscode ist hier:

// call the packages we need 
var mysql  = require('mysql'); //call mysql for db connection 

// configure the function to connect to the database 
var connection = mysql.createConnection({ 
    connectionLimit : 1000, 
    host  : 'localhost', 
    user  : 'test', 
    password : 'abcdefghi', 
    socketPath : '/var/run/mysqld/mysqld.sock' 
}); 

exports.connection = connection; 

Mein Datenbank-Abfrage-Code ist hier:

var db = require('../dbconnection'); 
var getPostId = function(id,callback){ 
    var sql = "SELECT post_id FROM posts.post_feeds WHERE id=?"; 
    db.connection.query(sql,[id],callback); 
} 

Mein app-Server-Code:

const fs = require('fs'); 
const https = require('https'); 
const express = require('express'); 
const app  = express(); 
const bodyParser = require('body-parser'); 
const getData = require('./dbhandler/getData'); 

router.route('/postids/') 
    .post(function(req,res){ 
     var success; 
     try { 
      var categoryId = req.body.categoryId; 
      getData.getPostId(categoryId,function(error, results, fields){ 
        if (!error){ 
         success = 1; 
         datasets = []; 
         db = {} 
         for (var i = 0 ; i < results.length; i++) { 
          db = { 
           "postId" : results[i]['post_id'] 
          } 
          datasets.push(db); 
         } 
         res.json({"success" : success, "datasets" : datasets}); 
        } else{ 
         logger.error("Route = /postfeedsbycategory/, error = "+error); 
         success = 0; 
         res.json({"success" : success}); 
        } 
       }); 
     } catch(error){ 
      logger.error("Route = /postfeedsbycategory/, error = "+error); 
      success = 0; 
      res.json({"success" : success}); 
     } 
    }); 
app.use('/api/v2', router); 

app.listen(port); 

Jede Ahnung, was da wollte passiert und wie kann ich dieses Problem lösen?

Hier ist mein Stack:

Node.js auf Digital-Ozean-Server mit Ubutnu 14.04 und Nginx (mit Express 4.15.2 + PM2 2.4.6) Datenbank MySQL ausgeführt wird (unter Verwendung von Knoten-mysql)

+1

Sie sollten auch den Code Umgang mit den HTTP-Anfragen zeigen. –

+0

@JulianGoacher Bitte beachten Sie die aktualisierten Beiträge. – user3528954

+0

Sie erstellen eine einzelne Datenbankverbindung, dh Sie können während Ihrer Anwendung nur eine Abfrage gleichzeitig ausführen ([Quelle] (https://github.com/mysqljs/mysql) # Ausführen-Abfragen-in-Parallel)). Möglicherweise möchten Sie sich [Verbindungspooling] (https://github.com/mysqljs/mysql#pooling-connections) ansehen. – robertklep

Antwort

1

Es wäre besser Verbindungspooling zu verwenden:

var mysql = require('mysql'); 

// configure the function to connect to the database 
var pool = mysql.createPool({ 
    connectionLimit : 1000, 
    host  : 'localhost', 
    user  : 'test', 
    password : 'abcdefghi', 
    socketPath : '/var/run/mysqld/mysqld.sock' 
}); 

exports.pool = pool; 

In Ihrer Anfrage Code:

var db = require('../dbconnection'); 
var getPostId = function(id,callback) { 
    var sql = "SELECT post_id FROM posts.post_feeds WHERE id=?"; 
    db.pool.query(sql,[id],callback); 
} 

Als Ausgangspunkt des Stils, gehen Sie wie folgt, wenn Sie das Ergebnis bearbeiten:

let datasets = results.map(result => { "postId": result['post_id'] }); 
+0

Wie entscheiden wir die connectionLimit im Verbindungspool – user3528954

+0

Sie sollten es nur auf die Standardeinstellung verlassen, die 10 ist und sehen, wie das für Sie geht. 1000 ist wahrscheinlich sehr groß - wie viele gleichzeitige Anfragen erwartest du? –

+0

Wann die Verbindung geschlossen oder gelöst werden soll. – user3528954