Экспресс-маршрутизатор node.js для рендеринга данных из выполненного оператора SQL - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь создать приложение 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) ; 
       }  

});

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы должны отрендерить в обратном вызове событие 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 голосов
/ 29 апреля 2019

Вы не рендерите никаких данных для передачи во внешний интерфейс, а также не возвращаете массив из функции.

Чтобы упорядочить свою логику, у вас должно быть что-то вроде этого:

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
<% }) %>
...