express.js передает результат запроса базы данных в шаблон - PullRequest
0 голосов
/ 03 октября 2018

Вот функция маршрута:

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function (req, res, next) {
    var mysql = require('mysql')
    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'Abcd1234',
        database: 'mtest'
    });

    connection.connect()
    global.products = "abc"

    connection.query('SELECT name from catalog_product_flat_1', function (err, rows, fields) {
        if (err) throw err
        global.products = rows[0].name;
    })

    connection.end()
    console.log('Product is: ', products)
    res.render(
        'product', { products: global.products, title: 'abc' }
    );
});

module.exports = router;

Независимо от того, как я не могу назначить результат запроса для продуктов, продукты: global.products в конечном итоге не определено, кто-нибудь знает, как это сделать?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Добро пожаловать в асинхронное программирование.Ваш код может быть записан как:

var express = require('express');
var mysql = require('mysql')

var router = express.Router();

var connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'Abcd1234',
  database: 'mtest'
}).connect();

/* GET users listing. */
router.get('/', function (req, res, next) {
  connection.query('SELECT name from catalog_product_flat_1', function (err, rows, fields) {
    if (err) throw err
    res.render('product', { products: rows, title: 'abc' });
  });
});

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  connection.end()
});

module.exports = router;

В приведенном выше коде,

  • Соединение с БД: мы не будем подключаться к нашей БД снова и снова при каждом попадании маршрута, мы будемсоздайте одно соединение и будете использовать его во всем приложении для любой операции с БД.
  • Операция с БД: нам придется ждать завершения операции и отправит ответ, как только мы получим результат.(асинхронный характер)
  • выход из процесса: теперь, так как мы используем одно соединение во всем приложении, как только наш процесс завершается, мы изящно закроем соединение с нашей базой данных.

ПожалуйстаУзнайте больше об асинхронной природе js и о том, как с ней бороться.Вы в настоящее время используете callbacks, но теперь у нас есть больше способов, таких как promises и async/await.https://medium.com/@tkssharma/writing-neat-asynchronous-node-js-code-with-promises-async-await-fa8d8b0bcd7c

0 голосов
/ 03 октября 2018

connection.query - это асинхронный метод, переместите логику рендеринга в функцию.Попробуйте это,

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function (req, res, next) {
    var mysql = require('mysql')
    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'Abcd1234',
        database: 'mtest'
    });

    connection.connect()

    connection.query('SELECT name from catalog_product_flat_1', function (err, rows, fields) {
        if (err) throw err
        let products = rows[0].name;

        console.log('Product is: ', products)

        res.render(
            'product', { products: global.products, title: 'abc' }
        );

        connection.end()
    })
});

module.exports = router;

А также, как упомянуто ниже @Raghav Garg, подключение к базе данных при каждом запросе может быть не идеальным (или может быть идеальным, если этот запрос не вызывается часто, поэтому вы нене хотите поддерживать связь с базой данных, зависит от ваших требований).Но я считаю, что это еще одна оптимизация производительности, которая не относится к вашему вопросу.

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