node express和mssql如何将数据库查询结果传递回视图模板

时间:2017-11-23 23:25:02

标签: sql-server callback

现在绕圈2天了。 我从Azure SQL数据库获取一些数据(连接参数在sqlconfig中)

function getCategories(callback) {
    var conn = new mssql.ConnectionPool(sqlconfig);
    var req = new mssql.Request(conn);
    console.log('in getCategories');
    conn.connect((err) => {
        if (err) {
            console.log('Connection Error:', err);
        }
        req.query("Select top 3 * from Categories", (err, rs) => {
            if (err) {
                console.log('Select error: ', err);
            } else {
                callback(rs.recordsets[0]);
            }
            conn.close();
        });
    })
}

我知道数据正在正确返回,因为当我这样做时

getCategories((rs) => console.log('Get-Categories', rs));

我得到了预期的结果

我正在努力让数据集传递到视图

app.get('/categories', (req, res) => {
    res.render('categories.hbs', {
        pageTitle: 'Catgories',
        currentYear: new Date().getFullYear(),
        categories: getCategories((rs) => rs)
    });
});

在类别中没有返回任何内容,因为它未定义 - 因此在调用代码时回调还没有完成运行。

如何让app.get等到getCategories完成,以便数据准备好传回视图。

2 个答案:

答案 0 :(得分:0)

我发现这篇文章让我了解它是如何工作的 Need to keep promise result in a variable for Nodejs mssql validation

并在那里写了我自己的答案。简短版本是在Node中你必须设置变量值INSIDE回调堆栈,而不是从函数返回它以分配给变量。

fetchDataFromDB('Select top 10 * from X', (err, res)=>{myvar = res})

答案 1 :(得分:0)

  

如何让app.get等到getCategories完成,以便数据准备好传回视图。

您可以将“getCategories”函数设置为中间件,将结果放在请求对象上,然后可以通过视图获取。只需在操作完成后调用next(),然后渲染视图。

app.get('/categories', getCategories, (req, res) => {
    res.render('categories.hbs', {
        pageTitle: 'Catgories',
        currentYear: new Date().getFullYear(),
        categories: req.categories
    });
});