javascript - module.exports 作用域和 node-mysql

标签 javascript mysql node.js

我有连接到数据库并管理连接的 database.js 文件我导出连接并在我的应用程序中重用它

    var mysql = require('mysql');

    pool = mysql.createPool({
        host: cfg.mysql.host,
        user: cfg.mysql.user,
        password: cfg.mysql.pass,
        database: cfg.mysql.db,
        port: cfg.mysql.port
    });


    function handleDisconnect() {
    pool.getConnection(function(err, cnt) {
    module.exports.connection = cnt;
    });

    pool.on('error', function (err) {
      console.log(err);
    });
    };

    handleDisconnect();
    process.on('uncaughtException', function (err) {
      console.error(err.code);
    if(err.code === "PROTOCOL_CONNECTION_LOST")
    handleDisconnect();
      console.log("Node NOT Exiting...");
    });

应用程序.js

    var db = require('./database');
     app.get('/test', function(req, res) {
        db.connection.query('SELECT * from table', function(err, result) {
           console.log(result);
          });
        }

这很好用。我的问题是当 mysql 服务器断开连接时。我通过调用 handleDisconnect() 函数来获取新连接来处理此错误。但是,当发生这种情况时,当我导航到我的浏览器/test 时,我的 app.js 中的连接未定义

TypeError: Cannot call method 'query' of undefined

想法?

最佳答案

您可以在数据库服务器上的每个查询之后简单地将连接放回池中 这是一个例子

db.js

var mysql = require('mysql');
var pool  = mysql.createPool({
  host     : 'localhost',
  user     : 'root',
  password : 'root',
  database : 'test',
  port: 8889
});

exports.getConnection = function(callback) {
    pool.getConnection(function(err, connection) {
        callback(err, connection);
    });
};

app.js

var db = require('./db');
var http = require("http");
var server = http.createServer(function(request, response) {
    db.getConnection(function(err, connection){
        if(!err){
            connection.query('SELECT * from users' , function(err, rows) {
                var users = '';
                for (var i = 0; i < rows.length; i++) {
                    users += rows[i].name + "<br />";
                }
                connection.release(); // always put connection back in pool after last query
                response.writeHead(200, {"Content-Type": "text/html"});
                response.write("<!DOCTYPE html>");
                response.write("<html>");
                response.write("<head>");
                response.write("<title>Hello World Page</title>");
                response.write("</head>");
                response.write("<body>");
                response.write(users);
                response.write("</body>");
                response.write("</html>");
                response.end();
           });
        }else{
            response.writeHead(200, {"Content-Type": "text/html"});
            response.write("<!DOCTYPE html>");
            response.write("<html>");
            response.write("<head>");
            response.write("<title>Hello World Page</title>");
            response.write("</head>");
            response.write("<body>");
            response.write(err.toString());
            response.write("</body>");
            response.write("</html>");
            response.end();
        }
    });
});
server.listen(9999);
console.log("Server is listening localhost:9999");

关于javascript - module.exports 作用域和 node-mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606647/

相关文章:

javascript - Javascript 中这两个函数声明有什么区别?

c# - 如何处理 MySqlDataAdapter 引入的数据集中单个列的数据?

MySQL - 将查询结果与当前表数据进行比较

node.js - Socket.io 客户端 javascript 文件位置(使用 nginx 反向代理)

c++ - 如何将视频文件作为输入传递给 NodeJS 中的子进程并接收帧/图像作为输出?

javascript - 获取删除请求无法正常工作

javascript - 如何覆盖 javascript 中的 navigator.plugins 或如何将其设置为 null?

JavaScript:将所见即所得编辑器对实时站点的更改转换为 jQuery 操作

mysql - 如何通过 select 查询从 mysql 表字段返回字符串的一部分?

node.js - 循环退出时 Node https 回调不触发