2016-09-27 294 views
0

我连接到在docker容器上运行的我的neo4j,并且当我尝试进行另一个连接/查询时出现错误。错误是“此套接字已被对方终止”。这是我Dockerfile与开放的端口:间歇性错误“此套接字已被对方终止”

EXPOSE 7474 7473 7687

这是我的驾驶工具:

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)); 

的方法,我做我的查询的Neo4j:

(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)); 

而且这是我的堆栈跟踪:

{"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} 

我很绝望,请帮助我!

+0

它接缝要与数据库和驱动器之间的螺栓协议的问题: [Neo4j的博尔特驾驶#229(https://github.com/neo4j/neo4j-ogm/issues/229) –

回答

1

只是一个建议 - 但它看起来像你的成功路径并不总是调用done()方法,因此会话并不总是关闭并返回到池中。

也许我建议你修改如下:

  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'}); 
      } 

要在别的块添加done()电话:

  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

嗨,我在else块中真的错过了done()函数的调用。但是在纠正之后问题依然存在。有人告诉我,也许Neo4J仍然关闭连接,因为他们没有获得足够的堆空间......但是在将2gb和页面缓存的堆空间升级到1gb后,问题依然存在...并且查看neo4j日志, t问题或重新启动.... –

0

我们得到了同样的错误,并追查到我们的代码,其中我们有时在交易中的所有查询完成之前提交我们的交易。

在看看你的代码,我建议是这样的:

(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));

不能肯定,这将解决你的问题,因为你不这样做,我们是什么,只是基于我们发现的建议。