Как я могу экспортировать «результат», возвращенный из запроса mysql?

Я пытаюсь использовать node js для размещения данных MySql в конечном итоге на странице HTML (на самом деле ejs).

Я использовал приведенный ниже код из примеров js узла W3. https://www.w3schools.com/nodejs/nodejs_mysql_select.asp

В конечном итоге я хотел бы использовать module.exports для «результата» и иметь доступ к массиву в другом файле. Я обнаружил, что это трудно сделать.

var mysql = require('mysql');

var con = mysql.createConnection({ 
    host: "localhost",
    user: "username", 
    password: "password", 
    database: "testdb" 
});

con.connect(function(err) {
    if (err) throw err; 
    con.query("SELECT * FROM customers", function (err, result, fields) {
    if (err) throw err; 
    console.info(result); 
});

// This is what is logged to the console.

// [ RowDataPacket { name: 'Company Inc', address: 'Highway 37' }, 
  RowDataPacket { name: 'Sanitation', address: 'Highway 27' }, 
  RowDataPacket { name: 'Ice Cream', address: 'Highway 11' } ]

// Above works but it doesn't do what I need it to. 
// Below is explained what I need to happen.

var mysql = require('mysql');

var x; // x is undefined

var con = mysql.createConnection({ 
    host: "localhost", 
    user: "username", 
    password: "password", 
    database: "testdb" 
});

con.connect(function(err) { 
    if (err) throw err; 
    con.query("SELECT * FROM customers", 
    function (err, result, fields) { 
    if (err) throw err; 
    x = result; // If I do a 'console.info(x);' here I get the array above. 
    // If try to 'module.exports = result;' here, it is 
    // undefined in the receiving file. }); 
});

console.info(x); // x is undefined, even though result was stored in x.

Я ожидал бы, что "console.info(x);" внизу кода, чтобы вернуть массив, но он не определен. Это заставляет меня думать, что что-либо в «завоевании» является локальным. Если это так, я подумал об использовании 'module. exports = result' в функции, но это также возвращает неопределенную переменную в принимающем файле. Если кто-нибудь знает, почему это происходит, или если есть решение, я был бы очень признателен за ваш совет :)

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
856
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, вам нужно экспортировать свою функцию и использовать ее, когда захотите.

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

config.js

var con = mysql.createConnection({ 
    host: "localhost", 
    user: "username", 
    password: "password", 
    database: "testdb" 
});
exports.default = con

файл ThatUsesResult.js

const db = ./config.js
db.con.connect(function(err) { 
    if (err) throw err; 
    con.query("SELECT * FROM customers", 
    function (err, result, fields) { 
    if (err) throw err; 
    //here you use your results, maybe res.json or whatever you want to do
});

Таким образом, вы можете разделить свой код и вызывать объект подключения dabatase всякий раз, когда вам это нужно. Помните принцип DRY.

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

Надеюсь, я помог!

Я ценю вашу помощь! Я не был знаком с промисами, но, изучив их, я думаю, что это тот путь, которым я должен идти!

Logan Luedtke 28.05.2019 14:32

Хорошо! Если это помогло, отметьте это как ответ, пожалуйста, @LoganLuedtke

Cesar 14.06.2019 07:34

Я заставил его работать! Проблема заключалась в том, что мой запрос был асинхронной функцией, и я ожидал получить свои данные, как если бы я программировал синхронно. Спасибо за Cesar за ваше предложение использовать Promises, так как это решило мою проблему. Ниже приведен рабочий код.

connection.js, также предложенный Цезарем.

    var mysql = require('mysql');

    var con = mysql.createConnection({
      host: "localhost",
      user: "username",
      password: "password",
      database: "testdb"
    });

    module.exports = con;

Страница query.js, теперь завернутая в обещание;

    var con = require('./connection.js');

    module.exports = new Promise(function(resolve, reject){
        con.connect(function(err) {
          if (err) throw err;
          con.query("SELECT * FROM customers", function (err, result, fields) {
            if (err) throw err;
              resolve(result);
          });
        });
    });

app.js, который при доступе к порту 3000 отображает display.ejs с данными db.

    var dataMod = require('./query.js');
    var express = require('express');

    var app = express();

    app.set('view engine', 'ejs');

    app.get('/', function(request, response){

      dataMod.then(function(data){
          response.render('display', {data: data});
      });

    });

    app.listen(3000);

И простая страница display.ejs

    <!DOCTYPE html>
    <html>
      <body>
        <p> <%= data[0].name %> <%= data[0].address %></p>
        <p> <%= data[1].name %> <%= data[1].address %></p>
        <p> <%= data[2].name %> <%= data[2].address %></p>
      </body>
    </html>

Что отображает

Компания Inc Шоссе 37

Городское Санитарное шоссе 27

Curbside лечит глушь

в браузере!

Это всего лишь пример, и он заведомо жестко запрограммирован. Однако наиболее важной частью является ссылка из базы данных в браузер с использованием промиса. Спасибо Цезарь!

Другие вопросы по теме