我正在使用带有mssql npm package的Node and Express来连接到SQL Server数据库。我在app.js
文件中执行此操作,该文件设置了一个global
变量来为数据库创建一个connectionPool
,如下所示(为简便起见,我省略了一些样板内容):
const mssql = require('mssql/msnodesqlv8'); // needs to use msnodesqlv8 driver for Windows Authentication to work
const express = require('express');
const app = express();
const DB_MYDB_Config = {
server: "localhost",database: "MYDB",options: {
trustedconnection: true // Windows auth enabled hence no username/password required
}
};
global.MSSQL_MYDB = new mssql.ConnectionPool(DB_MYDB_Config); //connectionPool available to whole app
我有一个名为offer.js
的模型文件,它可以执行以下操作:
async function getOffersAll() {
await MSSQL_MYDB.connect(); // connects to the database
try {
var result = await MSSQL_MYDB.request(MSSQL_MYDB).query('SELECT Top(1) * FROM [dbo].[Offer]');
return result; // returns the recordset of data
} catch (error) {
console.log(error);
} finally {
if (MSSQL_MYDB){
try {
await MSSQL_MYDB.close(); // closes the DB connection
}
catch (error) {
console.log('Error closing connection');
}
}
}
}
exports.getOffersAll = getOffersAll;
到目前为止,一切都很好。然后,我有了一个控制器文件index.js
,它实际上并不能正常工作(用注释解释):
var router = require('express').Router();
const Offer = require('../models/offer'); // the `offer.js` file
/* the function below works perfectly */
(async function () {
var rsOffersAll = await Offer.getOffersAll();
console.dir(rsOffersAll); // works great! recordset rsOffersAll is printed to console
})();
/* this is where it goes wrong even after commenting out the test function above */
router.get('/',async function(req,res) {
var rsOffersAll = await Offer.getOffersAll(); // this just hangs and eventually I get a login failed error for SQL Server.
console.dir(rsOffersAll);
res.render('index',{ pagetitle: 'Homepage'}); // never renders
});
module.exports = router;
我的问题是,为什么等待async function()
的结果的第一个Offer.getOffersAll()
不会失败,但是放置在router.get('/')
处理程序中的同一个异步函数会因登录错误而失败?如果我从var rsOffersAll = await Offer.getOffersAll();
处理程序中删除了router.get('/')
,则页面将呈现,但是我当然没有数据要传递给它。
即使我将测试函数的值存储在变量中并尝试将其放在router.get()
处理程序中,也会发生完全相同的事情:
async function getOffersTest() {
return await Offer.getOffersAll();
}
router.get('/',res) {
var rsOffersAll = await getOffersTest(); // still breaks
console.dir(rsOffersAll);
res.render('index',{ pagetitle: 'Homepage'}); // still never renders
});
我的最终问题是如何解决此问题,使其以应有的方式工作:访问主页时,路由器等待数据从数据库中返回,然后将其传递给视图或是否可以打印到控制台?