精华内容
下载资源
问答
  • I have a nodejs websocket server and I have the following problem.When my clients connect to the server and terminate gracefully the onclose method is called on those sockets and I perform clean up op...

    I have a nodejs websocket server and I have the following problem.

    When my clients connect to the server and terminate gracefully the onclose method is called on those sockets and I perform clean up operations on the closed socket.

    When the client disconnects due to network, the onclose method is not called. Is there any timeout to be set so onclose is called automatically after a timeout?

    I am using ws package for the websocket server in nodejs

    解决方案

    default ws implementation doesn't have a callback for network disconnects from client side

    You can find a keepAlive implementation here

    展开全文
  • 参照网上这段代码还是不能解决问题,本地连接不会出现断开,求大神们讲解var connection;function handleDisconnect() {connection = mysql.createConnection(db_config); // Recreate the connection, since// the ...

    参照网上这段代码还是不能解决问题,本地连接不会出现断开,求大神们讲解

    var connection;

    function handleDisconnect() {

    connection = mysql.createConnection(db_config); // Recreate the connection, since

    // the old one cannot be reused.

    connection.connect(function(err) { // The server is either down

    if(err) { // or restarting (takes a while sometimes).

    console.log('error when connecting to db:', err);

    setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,

    } // to avoid a hot loop, and to allow our node script to

    }); // process asynchronous requests in the meantime.

    // If you're also serving http, display a 503 error.

    connection.on('error', function(err) {

    console.log('db error', err);

    if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually

    handleDisconnect(); // lost due to either server restart, or a

    } else { // connnection idle timeout (the wait_timeout

    throw err; // server variable configures this)

    }

    });

    return connection;

    }

    handleDisconnect();

    展开全文
  • db/index.js数据库配置文件一、在数据库连接失败的情况下,回调函数,再次发起连接,直到连接成功为止。handleDisconnect(){this.connection.connect(function(err) {if(err) {// console.log('error when ...

    db/index.js数据库配置文件

    一、在数据库连接失败的情况下,回调函数,再次发起连接,直到连接成功为止。

    handleDisconnect(){

    this.connection.connect(function(err) {

    if(err) {

    // console.log('error when connecting to db:', err);

    setTimeout(_this.handleDisconnect, 2000);

    }

    });

    this.connection.on('error', function(err) {

    if(err.code === 'PROTOCOL_CONNECTION_LOST') {

    _this.handleDisconnect();

    } else {

    throw err;

    }

    });

    }

    二、mysql在8个小时内没有任何操作,就会自动中断连接

    因此,每个三个小时每个小时ping一次数据库,保持数据库连接状态

    clearInterval(pingInterval);

    pingInterval = setInterval(() => {

    _this.connection.ping((err) => {

    if (err) {

    console.log('ping error: ' + JSON.stringify(err));

    }

    });

    }, 3600000*3);

    三、完整代码如下:

    // 加载数据库模块

    var mysql = require('mysql');

    var _this;

    var pingInterval = null;

    var db_config = {

    host: "host", //主机地址

    user: "user", //数据库用户名

    password: "password", //数据库用户密码

    database: "database" //数据库名

    }

    class DB{

    constructor(){

    _this = this;

    this.connection = null;

    }

    handleDisconnect(){

    this.connection = mysql.createConnection(db_config);

    //数据库连接

    this.connection.connect(function(err) {

    if(err) {

    // console.log('error when connecting to db:', err);

    setTimeout(_this.handleDisconnect, 2000);

    }

    });

    this.connection.on('error', function(err) {

    if(err.code === 'PROTOCOL_CONNECTION_LOST') {

    _this.handleDisconnect();

    } else {

    throw err;

    }

    });

    // 每个小时ping一次数据库,保持数据库连接状态

    clearInterval(pingInterval);

    pingInterval = setInterval(() => {

    _this.connection.ping((err) => {

    if (err) {

    console.log('ping error: ' + JSON.stringify(err));

    }

    });

    }, 3600000*3);

    return this.connection;

    }

    }

    module.exports = DB;

    使用数据库的文件controller/query.js

    在开启事务的时候判断数据库连接是否连接错误,

    如果连接错误,再次发起连接。

    db.beginTransaction((err)=>{

    if(err!==null){

    db = _this.handleDisconnect();

    db.beginTransaction((err)=>{

    callback(err)

    })

    }else{

    callback(err)

    }

    })

    完整代码如下:

    const DB = require("../../db/index");

    const Async = require("async");

    var db;

    class Query extends DB{

    constructor(){

    super()

    db = this.handleDisconnect()

    }

    async getList(limit,page,cate,keywords,grade){

    return new Promise((resolve, reject) => {

    var mydatas = {data:[],total:0};

    // ....此处省略业务代码

    // 用Async代替嵌套

    var task = [

    (callback)=>{

    // 开启事务

    db.beginTransaction((err)=>{

    if(err!==null){

    db = _this.handleDisconnect();

    db.beginTransaction((err)=>{

    callback(err)

    })

    }else{

    callback(err)

    }

    })

    },

    (callback)=>{

    const sql = `...`;

    db.query(sql,(err,res)=>{

    callback(err);

    })

    },

    (callback)=>{

    // 提交事务

    db.commit((err)=>callback(err));

    }

    ];

    Async.waterfall(task,(err,res)=>{

    if(err){

    // 事务回滚

    db.rollback();

    }else{

    resolve(mydatas);

    }

    })

    })

    }

    }

    展开全文
  • Nodejs 断开重连redis

    千次阅读 2018-01-22 10:43:46
    原文地址:... 目前Nodejs端使用redis模块对redis服务进行连接,代码如下: var redisClient = redis.createClient(config.redisAuth); redisClient.on("error", function (err)

    原文地址:http://blog.csdn.net/qq_36971993/article/details/55506665

    目前Nodejs端使用redis模块对redis服务进行连接,代码如下:

    var redisClient = redis.createClient(config.redisAuth);
    
    redisClient.on("error", function (err) {
        redisClient.quit()
        logger.error("Error " + err);
        redisClient = redis.createClient(config.redisAuth);
    });
    
    module.exports = redisClient;

    当redis发生error的时候,首先是quit了这个连接,然后再创建一个新的连接。这样写出现了一个问题,就是当发生error然后连接quit了之后,该连接并没有像预想中的去重新创建新连接去连接,所以之后使用 redisClient 去set或者get的时候就会报错,此时redis的操作无法再正常进行,除非重启服务器重置连接。当初这么写是为了保证redis链接在异常情况下保证能重连,现在看来这种方式是有问题的。

    查看官方文档,确定redis库是有完善的自动重连机制的,所以以后这块我们就不做处理了。

    redisClient.on("error", function (err) {
        logger.error("Error " + err);
    });

    但并不能保证就一定没问题了,所以这里准备加入redis错误告警,对redis异常进行监控。

    redisClient.on("error", function (err) {
       report('RedisError');
       logger.error("Error " + err);
    });
    
    var client = redis.createClient({
        retry_strategy: function (options) {
            if (options.error.code === 'ECONNREFUSED') {
                // End reconnecting on a specific error and flush all commands with a individual error 
                report('连接被拒绝');
            }
            if (options.times_connected > 10) {
                report('重试连接超过十次');        
            }
            // reconnect after 
            return Math.max(options.attempt * 100, 3000);
        }
    });

    在redisClient初始化时,加入 retry_strategy 配置, 对连接的异常进行处理。

    此方法如果返回 数字 类型比如 1000, 则该连接 会在 1秒后重新连接。如果返回非数字类型或者是 Error类型,则中断重连!!(所以必须返回数字)。

    这里还有一个值得注意地方,当redis断开连接或者连不上的时候,会抛出一个异常,如果nodejs程序没有显示捕获这个异常进行处理,那么nodejs进程就会退出,所以需要如下类似的代码才能保证redis断开后重连。

    function uncaughtExceptionHandler(err){
        if(err && err.code == 'ECONNREFUSED'){
            //do someting
        }else{
            process.exit(1);
        }
    }
    process.on('uncaughtException', uncaughtExceptionHandler);
    展开全文
  • 主要给大家介绍了关于nodejs如何检测因特网是否断开的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用nodejs具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 最近在用Electron开发一款应用,其中有涉及到检测因特网是否断开的需求。Electron基于Chromium和Node.js,让你可以使用HTML、CSS和JavaScript构建应用。所以Electron提供nodejs、浏览器两套运行环境。 笔者最先考虑...
  • } }) google/baidu后发现了一个使用pool的实例 发现他的代码每一次请求都用pool创建一个connection,改进我的代码终于解决了一段时间后connection自动断开的问题。 正确代码为 pool =mysql.createPool(env); ...
  • nodejs 关于mysql模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分
  • 请教大家一个nodejs的问题,我有a.html页面,里面有个socket对象,a.html页面里面用iframe包涵了一个b.html页面,b.html里面引用了a.html里面的socket对象,结果,当我关闭这个b.html页面的时候会触发这个socket对象...
  • var connection;... console.info('如果是连接断开,自动重新连接') if (err.code === 'PROTOCOL_CONNECTION_LOST') { handleError(); } else { throw err; } }); } handleError();  
  • 用手柄玩着玩着游戏就会断开连接,手柄的西瓜灯开始慢闪,无限适配器不亮。 大概10-15秒又自动连接上了。 手柄用的是官方的充电电池,确定有电。适配器的驱动也更新过了 电脑win10系统。 求解这是咋回事。。。 突然...
  • 问题描述:nodejs服务需要在后台持续运行。可借助forever 或者 pm2 forever相关命令 //在服务器上全局安装(先安装nodejs) npm install -g forever 注意:如果安装失败,可尝试使用cnpm进行安装(需要安装...
  • realguess提出了一个问题:When to close MongoDB database connection in Nodejs,或许与您遇到的问题类似。回答者mpobrien给出了该问题的处理方式:Here's a potential solution based on the counting approach ...
  • 断开连接有两种方式 end()函数 在这种情况下 所有先前排队的查询 仍然可以继续继续发送到服务器,但是如果在执行到断开连接的命令之前发生了致命的错误,那么end()将不会被执行 connection.end(function(err){ //...
  • 解决方案有三个: 我用的第一个   1.screen 插件安装 screen -dmS win  screen -l 2.pm2守护进程 https://github.com/Unitech/PM2 3.nodup 命令,我用了感觉不好用 不用的时候记得要kill进程
  • Nodejs流程

    2020-06-19 13:01:45
    Nodejs http 模块创建服务流程 引入http模块: /*** * 引入HTTP模块,因为HTTP模块是Node js自带 所以不需要下载。 ... */ ...监听服务器,否则服务器或断开,并给他一个port server.listen(/**port/).
  • // 如果是连接断开,自动重新连接 if (err.code === 'PROTOCOL_CONNECTION_LOST') { connect(); } else { console.error(err.stack || err); } } } // 连接数据库 function connect () { db = mysql.create...
  • 发现他的代码每一次请求都用pool创建一个connection,改进我的代码终于解决了一段时间后connection自动断开的问题。   正确代码为 pool = mysql.createPool(env); exports.do = function (sql, ...
  • 由于mysql默认8小时连接无访问,就会断开.为此查了一下资料,有同种比较简单的解决方案: 1. 增加 MySQL 的 wait_timeout 属性的值。 修改 /etc/mysql/my.cnf文件,在 [mysqld] 节中设置:# Set a connection to wait...
  • nodejs连接pg数据库有两种方式,一种是直接连接、操作、断开还有一种是使用连接池,这种方式可以有效提升多并发的效率下边是使用两种不同方式的测试代码:var pgOpt = require('pg');/** 使用连接池* */function ...
  • nodejs运行之后,关掉链接,网站运行就会断开,需要安装forever,后台执行。安装方法如下(在windows和Linux下都能运行)://forever的安装:npm install forever -g//使用forever启动守护进程:forever start your_...
  • 所以可以使用下面这种方法来避免连接对视问题: function handleError (err) { if (err) { // 如果是连接断开,自动重新连接 if (err.code === ‘PROTOCOL_CONNECTION_LOST’) { connect(); } else { ...
  • 写在前面的在nodejs后台代码中,我们总是会和数据库打交道然而,每次都要写数据库的配置以及连接和断开,不胜其烦我就封装了一个连接池模块,不足之处还请多多批评上代码一下是写在mysqls.js中的var db = {};...
  • 我基于nodejs,socket.io做了一个web版的即时通讯.发现几个问题,请大家帮忙解决一下. 第一:每次连上以后,发不了几个消息就会自动断开,怎么办?有没有什么好的处理办法? 第二:每次刷新页面的时候总是会更换socket...
  • } }) google/baidu后发现了一个使用pool的实例 发现他的代码每一次请求都用pool创建一个connection,改进我的代码终于解决了一段时间后connection自动断开的问题。 正确代码为 pool =mysql.createPool(env); ...
  • 我最近正在做一个个人项目.... 上线后,几次请求两个数据接口后node自动断开,总是报告503. 我不清楚,但经过今天的调查,终于解决了.1.mysql链接正常模式mysql的一般用法如下:var mysql = require('my...
  • var net = require('net'); var port = 8080; var host = '127.0.0.1'; var client= new net.Socket(); //创建socket客户端 client.setEncoding('binary'); //连接到服务端 client.connect(port,host,...
  • 所以可以使用下面这种方法来避免连接对视问题: functionhandleError (err) { if(err) { // 如果是连接断开,自动重新连接 if(err.code ==='PROTOCOL_CONNECTION_LOST') { connect(); } else{ console.error...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 153
精华内容 61
关键字:

断开nodejs