Вывод MySQL JSON на веб-страницу - PullRequest
0 голосов
/ 12 июня 2019

У меня есть сервер Express, который отображает данные из базы данных MySQL.

Как бы вы пошли и превратили этот вывод в веб-страницу? На данный момент это просто JSON, как я могу отобразить FX. HTML-страница вместо данных?

Я знаю, что это глупый вопрос.

app.get("/get-cars", function (req, res) {
    let sql = "SELECT * FROM cars";
    let query = db.query(sql, (err, results) => {
        if(err) throw err;
        res.send(results);
    });
});

enter image description here

Ответы [ 4 ]

1 голос
/ 12 июня 2019

Если вы хотите отправить html-ответ клиенту вместо JSON-ответа, вы можете использовать шаблонизатор HTML.

Позвольте мне показать вам пример с Handlebars.js

Шаг 1: Выполнить npm install --save handlebars

Шаг 2. Создайте файл cars.hbs в корневом каталоге вашего проекта

Шаг 3: Добавьте следующий код в cars.hbs файл

<!DOCTYPE html>
  <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Cars</title>
    <style>
      html {
        padding: 0;
        margin: 0;
     }

      body {
        position: relative;
        font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
        width: 100%;
        margin: 0;
      }
    </style>
    </head>


    <body>
      <table>
        <tr>
            <th>Name</th>
            <th>Year</th>
            <th>Engine Size</th>
            <th>Accelaration</th>
            <th>Top Speed</th>
            <th>Consumption</th>
            <th>Image</th>
        </tr>
        {{#each cars}}
            <tr>
                <td>{{this.name}}</td>
                <td>{{this.enginesize}}</td>
                <td>{{this.maxpower}}</td>
                <td>{{this.accelaration}}</td>
                <td>{{this.topspeed}}</td>
                <td>{{this.consumption}}</td>
            </tr>
        {{/each}}
       </table>
     </body>
   </html>

Шаг 4: В вашем js-файле (который содержит get/cars api) добавьте следующий код

const handlebars = require("handlebars");
const fs = require("fs");
app.get("/get-cars", function (req, res) {
   let sql = "SELECT * FROM cars";
   let query = db.query(sql, (err, results) => {
       if(err) throw err;
       const data = { cars: result };
       const template = fs.readFileSync("./cars.hbs", "utf8");
       const html = handlebars.compile(template)(data);
       res.send(html);
   });
});

Шаг 5. Откройте браузер и перейдите на страницу http://localhost:3000/get-cars

Кроме того, вы можете вызвать свой API-интерфейс из внешнего интерфейса и отобразить данные в браузере, используя любое форматирование.

0 голосов
/ 13 июня 2019

Хорошо, так что из вашего вопроса я предполагаю, что вы хорошо разбираетесь в серверной части, но вам нужна помощь в ознакомлении с интерфейсами и средами рендеринга.

Как и многие разработчикиЯ бы сказал вам, что в этом случае есть много способов убить кошку, поэтому я рекомендую вам несколько фреймворков и библиотек:

Рекомендации: - Angular 4+ (мой личный фаворит)) - Реагируйте, - Vue - это очень хорошие интерфейсные среды, с которыми вы можете начать работу, чтобы создавать комплексные одностраничные приложения, которые легко масштабировать и уменьшать.Обратите внимание, что существует множество ДРУГИХ интерфейсных сред, из которых можно выбирать.

Знание того, как использовать Javascript, необходимо для манипулирования DOM путем рендеринга извлеченных данных с сервера (как в вашем случае), поэтому я дам вам два примера того, как сделать это, используя нативный JS и JQuery в качестве библиотеки

1)

// initiate your request
xhr = new XMLHttpRequest();
// check if the server has responded with a status code of 200 after the request has been made
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    results = JSON.parse(xhr.response);
    // the easiest workaround is to build the html string and then inject it into the tbody
    // the best approach would be to createElements and inject them as you loop through the retuned data
    
    // using the easiest approach
    myString = "";
    for (i = 0; i < results; i++) {
      myString += "<tr><td>" + results[i].jsonElementForHeader1 + "</td><td>" + results[i].jsonElementForHeader2 + "</td></tr>";
    }
    // put the generated stuff from the request into the table body as table rows
    tbody = document.getElementById("tbody").innerHTML = myString
  }
};

// Add an event listener that checks the progress of the request once initiated
xhr.addEventListener('progress', evt => {
  if ( evt.lengthComputable ) {
    const perc = evt.loaded / evt.total * 100;
    // log the percentage to the console for monitoring (or render it the way you want)
    console.log(perc);
  }
}, false);

// specify the method and URL that you would want to query
xhr.open('POST', 'http://your.domain:port/script', true);
// important, if you are using cookies,
xhr.withCredentials = true;
// initiate the request
xhr.send(res1);
<html>
  <head>
    <title>Thingy</title>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <td>
            <label>header 1</label>
          </td>
          <td>
            <label>header 2</label>
          </td>
        </tr>
      </thead>
      <tbody id = 'theTableBody'>
      </tbody>
    </table>
  </body>
</html>

2)

// launch your request to the server
$.post('http://your.domain:port/APIHandler', {'query': 'parameter(s) JSON Style'}, function(data) {
  // looping through the returned data to handle insertion of the data
  // we will use the recommended way this time round, but generating strings
  tbody = document.getElementById('theTableBody');
  for (i = 0; i < data.length; i++) {
     element = document.createElement("tr");
     element.innerHTML = "<td>" + data[i].desiredElementName1 + "</td><td>" + data[i].desiredElementName2 + "</td>";
     tbody.appendChild(element);
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>
  <head>
    <title>Thingy</title>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <td>
            <label>header 1</label>
          </td>
          <td>
            <label>header 2</label>
          </td>
        </tr>
      </thead>
      <tbody id = 'theTableBody'>
      </tbody>
    </table>
  </body>
</html>
0 голосов
/ 12 июня 2019

То, что вам нужно, называется шаблонизатором . Так же, как мы можем генерировать html в php, движки шаблонов помогают серверу создать страницу и вернуться в html.

Я бы хотел познакомить вас с pug как с простым движком шаблонов для экспресса.

npm install -S pug

Создайте новый файл с именем template.pug:

doctype html
html(lang="en")
  head
    title="cars data with pug"
  body
    h1 My Cars 
    #container.col
    ul
       each val in dbResult
          li= val.name

А внутри вашего экспресс-сервера:

var pug = require("pug");

app.get("/get-cars", function (req, res) {
    const compiledFunction = pug.compileFile("template.pug");
    let sql = "SELECT * FROM cars";
    let query = db.query(sql, (err, results) => {
        if(err) throw err;
         res.send(
          compiledFunction({
           dbResult: sql
         })
    });
});

Вуаля! Вы должны видеть свой HTML. Я оставлю немного веселья для вас, а также несколько ссылок

  1. документация на мопса .
  2. https://github.com/pugjs/pug
0 голосов
/ 12 июня 2019

Я думаю, что ваш код должен работать правильно, он должен отображать JSON Array в виде веб-страницы

res.send(results);

просто попробуйте открыть ваш веб-браузер и перейти на localhost: 3000 / get-cars , если вы не хотите отобразить результат в другом формате, не могли бы вы уточнить, в чем здесь проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...