@Tolych

Nodejs Express как вывести необходимый результат запроса в html?

Добрый день!

Пишу с нуля веб сервер, который по результатам post запроса должен выдавать результат на странице.
Для этого поставил nodejs, подключил express, express-generator, и модуль для общения с БД MSSQL, mssql.
Через генератор (expressjs.com/starter/generator.html) создал макет приложения.

В модели создал файл db.js для обращения к БД и исполнения хранимой процедуры с параметрами.
var sqlDb = require('../node_modules/mssql');
var settings = require('./settings');

exports.selectOubySummBuking = function(mon, tue, wed, thu, fri, sat, sun, buksumm, sql, callback){

  var conn = new sqlDb.Connection(settings.dbConfig);
  conn.connect()
  .then(function(){
      var req = new sqlDb.Request(conn);
      //req.verbose = true;
      req.input('mon', mon);
      req.input('tue', tue);
      req.input('wed', wed);
      req.input('thu', thu);
      req.input('fri', fri);
      req.input('sat', sat);
      req.input('sun', sun);
      req.input('buksumm', buksumm);
      req.execute(sql)
      .then(function(data){
        callback(data[0]);
      })
      .catch(function(err){
        console.log(err);
        callback(err);
      });
  })
  .catch(function(err){
      console.log(err);
      callback(err);
  });
};


В роутере, в файле index.js описал обработчик post запроса

var express = require('express');
var dbconnect = require('../model/db.js');
var outlets = require('../controller/outlet.js');
var router = express.Router();

// определяем метод который будет обрабатывать обращение
router.post('/oudb', function(req, res){
  var allBuking = req.body.allBuking;
  dbconnect.selectOubySummBuking(2, 2, 3, 4, 5, 5, 3, allBuking, "selectOubySummBuking", function(data) {
    res.render('index', {
              title: "Outlet DB",
              results: data
    });
  });
});


module.exports = router;


Результат выводиться через шаблонизатор ejs, код файла index.ejs

<!DOCTYPE html>
<html lang = "ru">
  <head>
    <meta charset="utf-8">
    <title>My app</title>
    <link rel="stylesheet" href="bootstrap/dist/css/bootstrap.css">
    <script src = "jquery/dist/jquery.js"></script>
    <script src = "bootstrap/dist/js/bootstrap.js"></script>
  </head>
  <body>
    <form action="/oudb" method="post">
      <input name="allBuking" type="number">
      <input type="submit">
    </form>
    <ul>
        <% for(var i=0; i<results.length; i++) {%>
       <li><%= results[i].City %></li>
        <% } %>
    </ul>
  </body>
</html>


Если хранимая процедура возвращает некоторое количество строк, то страница корректно отображается. так как в результате ренедринга, мы передали значения в results, но если процедура не вернет результат, как сделать так, чтобы на этой же странице отображалась фраза "результат не найден, измените параметры запроса" ???
  • Вопрос задан
  • 1757 просмотров
Решения вопроса 2
Shutik
@Shutik
Погромист халявщик
c ejs не знаком ... но мб как то так:
<ul>
  <% results.forEach(function(item){ %>
    <li><%= item.City %></li>
  <% }); %>
<% if (results.length == 0) { %>
  <li>результат не найден, измените параметры запроса</li>
<% } %>
</ul>
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Весь код переводить не буду, только измененные места:

var conn = new sqlDb.Connection(settings.dbConfig);
conn.connect()
    .then(function(){
        var req = new sqlDb.Request(conn);
        //req.verbose = true;
        req.input('mon', mon);
        req.input('tue', tue);
        req.input('wed', wed);
        req.input('thu', thu);
        req.input('fri', fri);
        req.input('sat', sat);
        req.input('sun', sun);
        req.input('buksumm', buksumm);
        req.execute(sql)
            .then(function(data){
                callback(null, data[0]); // use CPS, pass error as first argument, if any
            })
            .catch(function(err){
                console.log(err);
                callback(err, null); // use CPS, pass error as first argument, if any
            });
    })
    .catch(function(err){
        console.log(err);
        callback(err, null); // use CPS, pass error as first argument, if any
    });

// ...

dbconnect.selectOubySummBuking(2, 2, 3, 4, 5, 5, 3, allBuking, "selectOubySummBuking", function(error, data) {
    res.render('index', {
        title: "Outlet DB",
        results: data,
        error: error
    });
});


<!-- it's also possible to render error, if needed -->
<% if (results) { %>
<ul>
    <% for(var i=0; i<results.length; i++) {%>
        <li><%= results[i].City %></li>
    <% } %>
</ul>
<% } else { %>
    <p>No results found, change search params</p>
<% } %>


Чтоб было совсем красиво, можно возвращать из selectOubySummBuking promise и в контроллере пользоваться этим.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы