我正试图使用节点js将MySql数据最终放置在HTML(实际上是ejs)页面中。
我一直在使用W3的node js示例中的以下代码。 https://www.w3schools.com/nodejs/nodejs_mysql_select.asp
我最终想要做的是在'result'上使用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.log(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.log(x);' here I get the array above.
// If try to 'module.exports = result;' here, it is
// undefined in the receiving file. });
});
console.log(x); // x is undefined, even though result was stored in x.
我希望使用“ console.log(x);”在代码底部返回数组,但未定义。这使我认为“ con.query”中的任何内容都是本地的。如果是这样,我考虑使用'模块。函数中的exports = result”,但这还会在接收文件中返回未定义的变量。如果有人知道为什么会这样,或者有解决方案,我将非常感谢您的建议:)
答案 0 :(得分:0)
也许您需要做的就是导出函数,并在需要时使用它
我建议您导出数据库连接变量,以便可以在需要时使用它,例如:
config.js
var con = mysql.createConnection({
host: "localhost",
user: "username",
password: "password",
database: "testdb"
});
exports.default = con
fileThatUsesResult.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原理。
顺便说一句,我建议您使用promise而不是回调函数,这样您就可以管理异步调用
希望我能帮上忙!
答案 1 :(得分:0)
我成功了!问题是我的查询是一个异步函数,并且我希望像同步编码一样获取数据。感谢您对Cesar的使用Promises的建议,因为这解决了我的问题。下面是正在工作的代码。
connection.js,也由Cesar建议。
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "username",
password: "password",
database: "testdb"
});
module.exports = con;
query.js页面,现在包装在一个Promise中;
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上访问该应用程序时,它将使用db数据呈现display.ejs
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>
哪个显示
Company Inc Highway 37
城市自卫公路27
Curbside对待虚无处
在浏览器上!
这只是一个示例,并且已知为硬编码。但是,最重要的部分是使用Promise从数据库到浏览器的链接。谢谢塞萨尔!