【问题标题】:nodejs app crashes after inactivity on database connectionnodejs 应用程序在数据库连接不活动后崩溃
【发布时间】:2015-10-23 07:48:41
【问题描述】:

我正在编写一个 nodejs 网络服务,它将接受 JSON 并使用 (https://github.com/felixge/node-mysql) 将其输入到 mysql 表中。

如果没有数据传递给我的服务并且没有超时,我的服务工作正常(所以基本上应用程序会继续运行,但是只要我发送带有 JSON 数据的请求,然后将数据输入到 mysql 表中。一旦那个完成后,节点应用程序在空闲时间后被杀死,并出现以下错误

Error: Connection lost: The server closed the connection.
at Protocol.end (/home/user/sqlconnector/node_modules/mysql/lib/protocol/Protocol.js:103:13)
at Socket. (/home/user/sqlconnector/node_modules/mysql/lib/Connection.js:102:28)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)

我正在寻找一种优雅的方式来在完成处理时退出 sql 连接但不杀死 nodejs 应用程序。 我可以通过使用像 forever 这样的东西在崩溃时重新启动应用程序来解决它,但我想了解的是它们在代码中的一个根本错误......

这是我插入数据的代码的 sn-p...

var express = require('express');
var bodyParser = require('body-parser');  
var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'xxxx',
  user     : 'xxx',
  password : 'xxxx',
  database : 'test'
});

var app = express();
// set our port
var port = process.env.PORT || 3000;        

// parse application/json
app.use(bodyParser.json())

// get an instance of the express Router
var router = express.Router();              

// POST / gets json data 
router.post('/', function(req, res) {       

    var data = req.body[0].record;

    // INSERT INTO posts SET `name` = 'hello', `name2` = 'hello2'
    // inserting data into the parent level form
    var query = connection.query('INSERT INTO '+ tablename +' SET ?', data, function(err, result) {
        if (err) throw err;
        console.log(result.insertId);

    });
    console.log("Parent \n" + query.sql); 
    res.send("Post Received: statusCode:" + res.statusCode);

});

app.use('/api', router);

// START THE SERVER
app.listen(port);
console.log('Magic happens on port ' + port);

【问题讨论】:

    标签: mysql json node.js


    【解决方案1】:

    文档对此有很多说明。 See here.

    您几乎可以在查询完成后致电connection.end()。所以像

    // it implicitly opens the connection by querying
    connection.query('INSERT INTO '+ tablename +' SET ?', data, function(err, result) {
        if (err) throw err;
        console.log(result.insertId);
        connection.end();
    });
    

    【讨论】:

    • 顺便说一句,我只是想知道你为什么在var data = req.body[0].record; 中有[0]
    • 我有一个 [0] 因为这是我传入的 Json 的格式比平时有点奇怪
    • 不抱歉,建议不起作用,我仍然连接超时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2019-06-02
    • 2017-04-23
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多