Javascript 如果从express请求调用,则不会建立SQL连接

Javascript 如果从express请求调用,则不会建立SQL连接,javascript,sql,node.js,express,Javascript,Sql,Node.js,Express,我正在构建我的第一个Node.JS API,从昨天开始我就一直在试图解决一个问题 基本上,当有人连接到我的端点时,我需要从SQL数据库中获取一些数据。问题是根本没有建立到SQL的连接。 为了便于阅读,我创建了代码的简化版本: var Connection = require('tedious').Connection; const express = require('express'); require('dotenv').config(); class Server { const

我正在构建我的第一个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();
所以,在这个示例中,我有两个类,其中Server是围绕Express的包装器,ModelsSqlAccessor是访问sqldb的一种方式。 我正在连接到数据库的ModelsSqlAccessor的executeQuery(查询)方法的内部。当连接发生(或连接出现错误)时,应显示“INSIDE CONNECT”(内部连接)消息。 在给定的示例中,根本不显示此消息。相反,当请求到来时,响应永远不会到来——我的节点应用程序永远不会从executeQuery(“某些查询”)调用返回,也永远不会向客户端返回任何值

奇怪的是,如果我移动此呼叫:

let data = await this.sqlAccessor.executeQuery("some query");
在其他地方(例如,在设置GET endpoint之前,在服务器的构造函数中排列了几行(当然要删除Wait关键字,因为构造函数不能是异步的)),当我的应用程序运行时,连接就会建立,我会看到“INSIDE CONNECT”消息


这里有什么问题?如果此调用在端点处理程序中,为什么从未建立连接?

您缺少
connect
事件。当您注册
connect
事件时,自您在
ModelsSqlAccessor
的构造函数中建立连接以来,该事件已发生。@Xaqron您是对的!这就是人们最终阅读Microsoft文档()的原因。在('connect',function(err)…上,它们明确表示“如果连接通过,则尝试连接并执行查询”.这就是为什么我认为这一行实际上初始化了连接,虽然语法显然更像是注册一个事件处理程序,所以我可以自己考虑。一般来说,我不喜欢所有这些基于回调的node API。我想知道为什么它们没有与PromisesOne一起使用更多的东西-你认为保留它是一个好主意吗连接在节点运行时始终打开,或者我应该在每个请求中初始化一个新连接?啊哈,请提交一个答案,我会接受。我会保持连接打开以降低成本。尽管这取决于底层库的实际开发方式(它可能已经解决了这一问题)@Xaqron“成本”是什么意思?响应时间?