Javascript 如果从express请求调用,则不会建立SQL连接
我正在构建我的第一个Node.JS API,从昨天开始我就一直在试图解决一个问题 基本上,当有人连接到我的端点时,我需要从SQL数据库中获取一些数据。问题是根本没有建立到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
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“成本”是什么意思?响应时间?