首页 > 解决方案 > 如果从 express 请求中调用,则未建立 SQL 连接

问题描述

我正在构建我的第一个 Node.JS API,并且从昨天开始我一直在尝试解决一个问题。

基本上,当有人连接到我的端点时,我需要从 SQL 数据库中获取一些数据。问题是根本没有建立到 SQL 的连接。为了便于阅读,我创建了代码的简化版本:

var Connection = require('tedious').Connection;
const express = require('express');
require('dotenv').config();

class Server {
    constructor() {
        this.sqlAccessor = new ModelsSqlAccessor();
        this.app = express();
        this.app.get("/api/endpoint1", async (req, res) => {
            let data = await this.sqlAccessor.executeQuery("some query");
            res.send(data);
        });
    }

    start() {
        this.app.listen(3000, () => console.log("Listening on port 3000..."));
    }
}


class ModelsSqlAccessor {
    constructor() {
        let config = {
            userName: process.env.MJIOT_MODELSDB_USER,
            password: process.env.MJIOT_MODELSDB_PASS,
            server: process.env.MJIOT_MODELSDB_SERVER,
            options: {
                database: process.env.MJIOT_MODELSDB_DATABASE,
                encrypt: true
            }
        };
        this.connection = new Connection(config);
    }

    executeQuery(query) {
        let conn = this.connection;
        return new Promise(function(resolve, reject) {
            conn.on('connect', function(err) {
                console.log('INSIDE CONNECT');
                //execute query...
            });
        });
    }
}

let server = new Server();
server.start();

所以,在这个例子中,我有 2 个类,其中 Server 是 Express 的包装器,ModelsSqlAccessor 是访问 SQL DB 的一种方式。在 ModelsSqlAccessor 的 executeQuery(query) 方法中,我连接到数据库。当连接发生(或连接出错)时,应显示“INSIDE CONNECT”消息。在给定的示例中,根本不显示此消息。相反,当请求到来时,响应永远不会到来——我的节点应用程序永远不会从 executeQuery("some query") 调用返回,也永远不会向客户端返回任何值。

对我来说奇怪的是,如果我移动这个电话:

let data = await this.sqlAccessor.executeQuery("some query");

在其他地方(例如服务器的构造函数中的几行,在设置 GET 端点之前(当然删除 AWAIT 关键字,因为构造函数不能是 ASYNC)),当我的应用程序运行时建立连接,我看到“INSIDE CONNECT “ 信息。

这里有什么问题?如果此调用在端点处理程序内部,为什么永远不会建立连接?

标签: javascriptsqlnode.jsexpress

解决方案


推荐阅读