node.js表示路由器从执行的SQL语句中呈现数据

问题描述 投票:0回答:2

我正在尝试构建node.js + express应用程序,它消耗SQL服务器数据库中的数据。但我在executeStatement()路由器功能范围内得到app.get()的响应时遇到问题。我希望我的代码能够呈现一个数组对象,我可以在我的ejs模板或视图中使用它。如下面的代码所示,column.value是我想在前端使用的主要对象数组。

PS:我对编程世界还很陌生。谢谢你的帮助!

var express = require('express');
var tediousExpress = require('express4-tedious');
var app = express();
var Connection = require('tedious').Connection;
var Request = require('tedious').Request;

app.set('view engine', 'ejs')
app.set('views', './views')

var config = { 'contains my credentials'  }
var connection = new Connection(config);

app.use(function (req, res, next) {
    req.sql = tediousExpress(connection);
    next();
});


app.get('/products', function (req, res ) {

    /* I want to get column.value object to be rendered to my frontend 
       I already used res.json() here but it returns nothing*/ 

    function executeStatement() {
        request = new Request("select count * from table where ArticleId= 
                24588 for json path", function(err, data) {
          if (err) {
            console.log(err);
          } else {
            console.log('total rows fetched ') ;
          }
          connection.close();
        });

       request.on('row', function(columns) {
          columns.forEach(function(column) {
            if (column.value === null) {
              console.log('NULL');
            } else {
                 column.value ;       
                }
          });

        });
      connection.execSql(request) ; 
       }  

});

javascript node.js express azure-sql-database ejs
2个回答
1
投票

您需要在回调中渲染row事件:

app.get('/products', function (req, res ) {
  // assuming you get the datas in column.value
  request = new Request("select count * from table where ArticleId=24588 for json path", function(err, rowCount) {
    if (err) {
      console.log(err);
    } else {
      console.log('total rows fetched ') ;
    }
    connection.close();
  }

  request.on('row', function(columns) {
    const datas = []; // <-- array to hold values
    columns.forEach(function(column) {
      if (column.value === null) {
        console.log('NULL');
      } else {
        datas.push(column.value);
      }
    });
    res.render('myView', { datas })
  });
  connection.execSql(request);
}

在您的view,您可以访问datas,如:

<% datas.forEach(value => { %>
  // do something like
  // <p><%= value %></p>
<% }) %>

0
投票

您没有渲染任何数据传递给前端,也没有从函数返回数组。

为了消除你的逻辑,你应该有这样的事情:

app.get('/products', function(err, data) {
  res.render('products', { arrData: executeStatement() }, function(err, data) {
    // ...
  })
})

executeStatement() { // ... }

然后在executeStatement()column.value改为return column.value

在前端模板中,您可以迭代数据并根据需要输出:

<% arrData.forEach(value => { %>
  // do something with each value
<% }) %>
© www.soinside.com 2019 - 2024. All rights reserved.