Я пытаюсь использовать 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' в функции, но это также возвращает неопределенную переменную в принимающем файле. Если кто-нибудь знает, почему это происходит, или если есть решение, я был бы очень признателен за ваш совет :)
Возможно, вам нужно экспортировать свою функцию и использовать ее, когда захотите.
Я предлагаю вам экспортировать переменную подключения к базе данных, чтобы вы могли использовать ее в любое время, например:
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.
Кстати, я рекомендую вам использовать обещания вместо функций обратного вызова, чтобы вы могли управлять своими асинхронными вызовами.
Надеюсь, я помог!
Хорошо! Если это помогло, отметьте это как ответ, пожалуйста, @LoganLuedtke
Я заставил его работать! Проблема заключалась в том, что мой запрос был асинхронной функцией, и я ожидал получить свои данные, как если бы я программировал синхронно. Спасибо за 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 лечит глушь
в браузере!
Это всего лишь пример, и он заведомо жестко запрограммирован. Однако наиболее важной частью является ссылка из базы данных в браузер с использованием промиса. Спасибо Цезарь!
Я ценю вашу помощь! Я не был знаком с промисами, но, изучив их, я думаю, что это тот путь, которым я должен идти!