javascript - Node Express mysql 第二条路由调用崩溃

标签 javascript mysql node.js express

我正在尝试设置 API。当使用“/”调用默认路由时,可以多次调用该路由,但“/count”路由只能调用一次,然后崩溃并出现此错误:

/Users/node_modules/mysql/lib/protocol/Parser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:467:11)
    at ServerResponse.header (/Users/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/Users/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/Users/node_modules/express/lib/response.js:267:15)
    at ServerResponse.send (/Users/node_modules/express/lib/response.js:158:21)
    at Query.<anonymous> (/Users/server_sql/testingAPI/routes/index.js:25:36)
    at Query.<anonymous> (/Users/node_modules/mysql/lib/Connection.js:525:10)
    at Query._callback (/Users/node_modules/mysql/lib/Connection.js:491:16)
    at Query.Sequence.end (/Users/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
    at Query._handleFinalResultPacket (/Users/node_modules/mysql/lib/protocol/sequences/Query.js:139:8) 

app.js

const http = require('http');
const cors = require('cors');
const body_parser = require('body-parser');
const databases = require('./connection_management');
const route = require('./routes/index');
const app = express();

app.use(cors());
app.use(body_parser.urlencoded({
    extended: true
}));
app.use(body_parser.json());

app.use(databases.connectionsSql);

app.use('/', route);

http.createServer(app).listen(8080, (err) => {
    if (!err)
        console.log("API ready and HTTP listen on port 8080.");
    else
        console.log(err)
});

module.exports = app;

路线/index.js

var router = require('express').Router();
var connection = require('../connection_management');

router.get('/', function(req, res){
    res.send('Default route');
});

function getCo(){
    return connection.coSql['test'].pool; 
}

router.get('/count', function(req, res){
    var pool = getCo();
    var countQuery = "SELECT COUNT(data) FROM table WHERE data IS NOT NULL";
    try {
        pool.getConnection(function(errco, connection){
            if(errco) return res.send(errco);
            connection.query(countQuery, function(error, result){
                if (error) throw error;
                else {
                    try{
                        connection.release();
                        return res.send(result);
                    } catch (err) {
                        return res.send(err);
                    }
                }
            });
        })
    }catch (err){
        return res.send(err);
    }
})

module.exports = router;

connection_management.js

const fs = require('fs');
var mysql = require('mysql');

var config = fs.readFileSync('config.json');
config = JSON.parse(config);

const coSql = [];
exports.connectionsSql = (req, res, next) =>  {
    for (let i = 0; i < config.sql.databases.length; i++) {
        if (coSql[config.sql.databases[i].name]) {
            next();
        } else {
            coSql[config.sql.databases[i].name] = {};
            coSql[config.sql.databases[i].name].pool = mysql.createPool({
                host: config.sql.databases[i].host, 
                user: config.sql.user, 
                password: config.sql.password, 
                database: config.sql.databases[i].name});
        }
    }
    next();
}

module.exports.coSql = coSql;

config.js

{
    "sql":{
        "user": "foo",
        "password": "bar",
        "databases":[
            {
                "name": "test",
                "host": "localhost"
            }
        ]
    }
}

感谢您的帮助、解决和理解问题。

最佳答案

route/index.js中:


router.get('/count', function(req, res){
    var pool = getCo();
    var countQuery = "SELECT COUNT(data) FROM table WHERE data IS NOT NULL";
    try {
        pool.getConnection(function(errco, connection){
            if(errco) throw New Error(errco); // <---- CHANGED THIS.
            connection.query(countQuery, function(error, result){
                if (error) throw error;
                else {
                    try{
                        connection.release();
                        return res.send(result);
                    } catch (err) {
                        throw New Error(err); // <---- CHANGED THIS.
                    }
                }
            });
        })
    }catch (err){
        return res.send(err);
    }
})

由于您编写错误捕获的方式,您可能会在代码中多次调用 res.send

我已经用抛出的错误替换了您的 2 个 res.send() 方法调用,以便在底部的最终 catch block 中捕获并处理它们。

关于javascript - Node Express mysql 第二条路由调用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58918734/

相关文章:

Javascript存储(firebase)firestore数据总是覆盖第一部分数据

javascript - 在 google-app 脚本中的 If..If Else..Else 中调用函数

javascript - 为什么 click 事件首先由元素上的 onclick 触发,而不是 $(document).on ('click' )?

javascript - 我想将可更改的数据存储在表行的一列中

mysqld_exporter.service 中的 mysqld_exporter 数据源名称

Mysql PREPARE 语句在记录插入时花费了很多时间

Mysql无密码登录、有密码被拒绝

javascript - Xpath 函数在剧作家中不起作用

node.js - Nodejs(通用池): release the resource when catching an error

javascript - node.js 从 stdin 读取像 ä,ö 这样的字母