简体   繁体   English

Node.js和MySQL:HTTP服务器在首次运行后停止

[英]Node.js & MySQL: HTTP server stops after first run

I'm using node-mysql. 我正在使用node-mysql。 Below codes taken from http://blog.josedacruz.com/2013/07/19/learning-node-js-using-mysql/ 以下代码取自http://blog.josedacruz.com/2013/07/19/learning-node-js-using-mysql/

var http = require('http');
var mysql = require('mysql');

var connection = mysql.createConnection({
  host : 'localhost',
  port : 3306,
  database: 'aaa',
  user : 'root',
  password : 'z'
});

http.createServer(function(req, res){
    res.writeHeader(200);
    res.write('Connect to mySql\n');
    // Connect to mySql (if there is an erro, report it and terminate de request)
    connection.connect(function(err){
        if(err != null) {
            res.end('Error connecting to mysql:' + err+'\n');
        }
    });

    connection.query("SELECT value FROM variable WHERE name = 'site_name'", function(err, rows){
        if(err != null) {
            res.end("Query error:" + err);
        } else {
            // Shows the result on console window
            console.log(rows[0]);
            res.end("Success!");
        }
        // Close connection
        connection.end();
    });
}).listen(80);

First thing first, I feel strange the connection.end not same level with connection.connect 首先,我对connection.endconnection.connect级别不同感到奇怪

I've tried change the connection to be same level and also put on different place, but still no luck 我试过将connection更改为同一级别,并放置在不同的位置,但是仍然没有运气

Below is the error in terminal when HTTP server stops after first run (note: MyTube is the result of query) 以下是HTTP服务器在首次运行后停止时终端中的错误(注意: MyTube是查询的结果)

{ value: 'MyTube' }
 
Error: Cannot enqueue Quit after invoking quit.
    at Protocol._validateEnqueue (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:131:16)
    at Protocol._enqueue (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:98:13)
    at Protocol.quit (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:61:36)
    at Connection.end (/home/mydir/node/node_modules/mysql/lib/Connection.js:155:18)
    at Query._callback (/home/mydir/node/app.js:31:20)
    at Query.Sequence.end (/home/mydir/node/node_modules/mysql/lib/protocol/sequences/Sequence.js:75:24)
    at Protocol._validateEnqueue (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:153:6)
    at Protocol._enqueue (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:98:13)
    at Connection.query (/home/mydir/node/node_modules/mysql/lib/Connection.js:140:25)
    at Server.<anonymous> (/home/mydir/node/app.js:22:16)
    --------------------
    at Quit.Sequence (/home/mydir/node/node_modules/mysql/lib/protocol/sequences/Sequence.js:15:20)
    at new Quit (/home/mydir/node/node_modules/mysql/lib/protocol/sequences/Quit.js:8:12)
    at Protocol.quit (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:61:45)
    at Connection.end (/home/mydir/node/node_modules/mysql/lib/Connection.js:155:18)
    at Query._callback (/home/mydir/node/app.js:31:20)
    at Query.Sequence.end (/home/mydir/node/node_modules/mysql/lib/protocol/sequences/Sequence.js:75:24)
    at Protocol._validateEnqueue (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:153:6)
    at Protocol._enqueue (/home/mydir/node/node_modules/mysql/lib/protocol/Protocol.js:98:13)
    at Connection.query (/home/mydir/node/node_modules/mysql/lib/Connection.js:140:25)
    at Server.<anonymous> (/home/mydir/node/app.js:22:16)

The problem is that you're trying to reuse a connection created by mysql.createConnection after that connection has been closed by connection.end() . 问题是您正在尝试重用mysql.createConnection创建的连接, mysql.createConnection该连接已由connection.end()关闭。

You need to move the call to mysql.createConnection to inside the callback to http.createServer , or (which I would recommend) use connection pooling instead. 您需要调用移动mysql.createConnection回调里面http.createServer (这我会建议)使用连接池来代替。

One way to quickly solve this is to remove your connection.connect and connection.end calls and rely on the implicit connection made by connection.query 一种快速解决此问题的方法是删除您的connection.connectconnection.end调用,并依赖由connection.query的隐式connection.query

http.createServer(function(req, res){
    res.writeHeader(200);
    res.write('Connect to mySql\n');     
    connection.query("SELECT value FROM variable WHERE name = 'site_name'", function(err, rows){
        if(err != null) {
            res.end("Query error:" + err);
        } else {
            // Shows the result on console window
            console.log(rows[0]);
            res.end("Success!");
        }
    });
}).listen(80);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM