在我的登录表单中,我有一个选项,允许我选择要连接的数据库,所以我正在尝试创建一个函数来执行此操作。
在db配置文件中,我有一个名为setDB
的函数,它转到另一个名为makeConnection
的函数,它将dbname作为参数发送并处理该函数的结果。
问题是第二个函数不返回任何结果,只有promise pending
。
在这个函数中,我有3个返回,这意味着将在setDB
函数中处理的错误,但这不起作用。
var mssql = require('mssql');
module.exports =
{
setDB: (req, res) =>
{
console.log('Prepare to connect to ' + req);
var result = makeConnection(req);
console.log(result);
if(result == 0)
{
res.send('Unknown database!');
}
else if(result == 1)
{
res.send('Error trying to connect!')
}
else if(result == 2)
{
res.send('Connection done!')
}
//return connection;
}
}
function makeConnection(dbname)
{
console.log('Start connection....');
return new Promise(function(resolve, reject) {
console.log('Database: '+ dbname);
var configs = {
Emp1: {
user: "us",
password: "pass",
server: "ip",
database: "Emp1"
},
Emp2: {
user: "us",
password: "pass",
server: "ip",
database: "Emp2"
}
};
var config = configs[dbname];
if(config == undefined)
{
return 0;
}
var connection = new mssql.Connection(config);
connection.connect(function(err)
{
if (err) {
console.log(err);
reject(err);
return 1;
} else {
resolve(connection);
console.log('Database Connected!');
return 2;
}
});
});
}
控制台打印:
更好的方法是什么? 我想做一个单独的连接,而不是在每个请求中进行连接......例如,它必须准备好由2个用户同时在不同的数据库中使用。
哪种方法更好?
谢谢
答案 0 :(得分:2)
makeConnection()
返回一个Promise。当你打电话时很自然:
var result = makeConnection(req);
console.log(result);
这将导致记录待处理的承诺。那是应该做的。您的函数会立即返回一个待处理的承诺,该承诺将在异步操作返回后解析。但是在尝试记录结果之前,您并没有等待它们。你需要使用promise的then()
函数来准备结果:
makeConnection(req)
.then(result => {
console.log(result);
if(result == 0)
{
res.send('Unknown database!');
}
else if(result == 1)
{
res.send('Error trying to connect!')
}
else if(result == 2)
{
res.send('Connection done!')
}
}