2016-09-27 2 views
0

Ich verbinde mich mit meinem Neo4j, der auf einem Andock-Container ausgeführt wird, und es wird ein Fehler angezeigt, wenn ich versuche, eine weitere Verbindung/Abfrage herzustellen. Der Fehler ist "Dieser Socket wurde von der anderen Partei beendet". Das ist mein Dockerfile mit den geöffneten Ports:Intermittierender Fehler "Dieser Socket wurde vom anderen Teilnehmer beendet"

EXPOSE 7474 7473 7687

Das ist mein Fahrer Dienstprogramm:

var neo4j = require("neo4j-driver").v1, 
    config = require("../../config"); 

(function(module){ 
    module.exports = function(){ 
     config.neo4j.server = 'localhost'; 
     return neo4j.driver("bolt://" + config.neo4j.server, neo4j.auth.basic(config.neo4j.user, config.neo4j.password)); 
    } 
}(module)); 

Die Art, wie ich bin meine Anfragen an Neo4j machen:

(function(module){ 
    var driver = require('../../../utils/neo4j-driver')(), 
     Q = require('q'), 
     logger = require('../../../utils/logger'), 
     BaseNeo4jModel = require('../../../utils/neo4j-model'); 

    function userDBAuth(user){ 
     var deferred = Q.defer(); 
     var session = driver.session(); 

     session 
      //.run("MATCH (a:Person) RETURN a.name AS name, a.uuid as uuid") 
      .run("MATCH (user:User {email:{email}})" 
        + "RETURN user", 
        { email: user.email}) 
      .then(function (result) { 
       logger.debug('fetching results...'); 

       if(result.records.length > 0){ 
        var records = []; 

        result.records.forEach(function(record){ 
         records.push(new BaseNeo4jModel(record)); 
        }); 

        done(); 

        deferred.resolve(records); 
       } else { 
        deferred.reject({sucess: false, message: 'User not Found'}); 
       } 

      }).catch(function(err) { 
       logger.error(err); 
       done(); 
       deferred.reject(err.fields[0]); 
      }); 

      return deferred.promise; 

     function done(){ 
      session.close(); 
      driver.close(); 
     } 
    } 

    module.exports = userDBAuth; 

}(module)); 

Und das ist mein Stack-Trace:

{"name":"auth-services","hostname":"MacBook-Pro-de-Vinicius.local","pid":16292,"level":50,"err":{"message":"This socket has been ended by the other party","name":"Error","stack":"Error: This socket has been ended by the other party 
at TLSSocket.writeAfterFIN [as write] (net.js:286:12) 
at NodeChannel.write (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/node_modules/neo4j-driver/lib/v1/internal/ch-node.js:285:20) 
at Chunker.flush (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/node_modules/neo4j-driver/lib/v1/internal/chunking.js:114:18) 
at Connection.sync (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/node_modules/neo4j-driver/lib/v1/internal/connector.js:487:21) 
at Session.run (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/node_modules/neo4j-driver/lib/v1/session.js:89:20) 
at userDBAuth (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/app/api/auth/services/userDBAuth.js:13:7) 
at Object._auth [as auth] (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/app/api/auth/services/auth.js:9:3) 
at Server.auth (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/app/api/auth/resources/auth.js:7:12) 
at next (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/node_modules/restify/lib/server.js:906:30) 
at f (/Users/viniciussouza/Sites/WeddSocial/backend/weddsocial-auth/node_modules/once/once.js:25:25)","code":"EPIPE"},"msg":"This socket has been ended by the other party","time":"2016-09-27T11:12:33.163Z","v":0} 

Ich bin verzweifelt, bitte hilf mir!

+0

Es Nähte ein Problem mit dem Bolt-Protokoll zwischen Datenbank und Treiber sein: [Neo4j Schraubeneinzieher # 229] (https://github.com/neo4j/neo4j-ogm/issues/229) –

Antwort

1

Nur ein Vorschlag - aber es sieht so aus, als ob Ihr Erfolgspfad nicht immer die Methode done() aufruft und daher die Sitzung nicht immer geschlossen und in den Pool zurückgegeben wird.

könnte ich schlage vor, Sie ändern die folgende:

  if(result.records.length > 0){ 
       var records = []; 

       result.records.forEach(function(record){ 
        records.push(new BaseNeo4jModel(record)); 
       }); 

       done(); 

       deferred.resolve(records); 
      } else { 
       deferred.reject({sucess: false, message: 'User not Found'}); 
      } 

So fügen Sie einen done() Aufruf im else-Block:

  if(result.records.length > 0){ 
       var records = []; 

       result.records.forEach(function(record){ 
        records.push(new BaseNeo4jModel(record)); 
       }); 

       done(); 

       deferred.resolve(records); 
      } else { 
       done(); 
       deferred.reject({sucess: false, message: 'User not Found'}); 
      } 
+0

Hallo, ich wirklich einen Aufruf der Funktion done() bei else Block verpasst. Aber nach der Korrektur bleibt das Problem bestehen. Jemand hat mir gesagt, dass die Neo4J die Verbindung noch schließt, weil sie nicht genügend Heapspeicher bekommen ... aber nach dem Upgrade des Heapspeichers für 2GB und dem Seitencache auf 1GB bleibt das Problem bestehen ... und auf neo4j Logs schaut es nicht t Probleme oder Neustarts .... –

0

wir die gleichen Fehler wurden immer und verfolgt sie unseren Code nach unten, wo Wir haben unsere Transaktion manchmal erst ausgeführt, als alle Abfragen in der Transaktion abgeschlossen waren.

einen Blick auf Ihren Code zu haben, würde ich vorschlagen, so etwas wie:

(function (module) { 
 
    var driver = require('../../../utils/neo4j-driver')(), 
 
     Q = require('q'), 
 
     logger = require('../../../utils/logger'), 
 
     BaseNeo4jModel = require('../../../utils/neo4j-model'); 
 

 
    function userDBAuth(user) { 
 
     var session = driver.session(); 
 

 
     return session 
 
      .run("MATCH (user:User {email:{email}}) RETURN user", {email: user.email}) 
 
      .then(function (result) { 
 
       logger.debug('fetching results...'); 
 

 
       if (result.records.length === 0) { 
 
        return Q.reject({success: false, message: 'User not Found'}); // will be caught by the .catch() below 
 
       } 
 
       var records = result.records.map(function(record) { 
 
         return new BaseNeo4jModel(record); // assume this is synchronous and doesn't return a promise 
 
        }); 
 
       done(); 
 
       return records; 
 
      }) 
 
      .catch(function (err) { 
 
       logger.error(err); 
 
       done(); 
 
       Q.reject(err.fields[0]); // return a rejected promise that can be caught by the caller of userDBAuth 
 
      }); 
 

 
     function done() { 
 
      session.close(); 
 
      driver.close(); 
 
     } 
 
    } 
 

 
    module.exports = userDBAuth; 
 

 
}(module));

nicht sicher, dass dies Ihr Problem zu lösen, wie Sie nicht genau das, was wir sind, nur ein Vorschlag basierend auf was wir gefunden haben.

Verwandte Themen