我是Node.js和Express的新手。我知道函数是异步执行的,但我不知道如何使用全局变量。在这里,我连接到mysql数据库,检索查询结果并在我的test.html页面上呈现它们。然后在mysql.js文件中,我想将这些结果保存在一个名为entry的数组中,以便其他get()可以使用那些相同的结果。我对Node.js的理解有限,我能想到的唯一选择就是在另一个get()中再次查询数据库。如何使用此全局来保存匿名函数的查询结果?我还调用什么事件和函数,以便我可以正确执行我的connection.end()?
//mysql.js
var express = require('./express');
var mysql = require('mysql');
var hbs = require('./hbs');
var app = express();
app.set('view engine', 'html');
app.engine('html', hbs.__express);
var connection = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'password',
database: 'db',
port: 3306
});
connection.connect();
entry=[];
app.get('/', function(req, res){
connection.query(
'SELECT * FROM table where ID < 10;',
function(err, result, fields)
{
if(err) throw err;
res.render('test',{title:"title", entries:result});
entry = result;
});
});
app.get('/article/:id', function(req, res) {
res.render('article',{title:entry.title, blog:entry});
});
app.listen(3000);
//connection.end();
<h1>HTML Test</h1>
{{#each entries}}
<p>
<a href="/article/{{ID}}">{{Name}}</a><br/>
Name: {{Name}}
</p>
{{/each}}
答案 0 :(得分:3)
简单的方法是运行查询以在请求时检索每篇文章。你的第一条路线('/'
)看起来不错。只需为第二条路线添加类似的查询:
connection.query('SELECT * FROM table WHERE ID=?', [req.params.id],
function(err, rows, fields)
{
if (err) { throw err; }
if (!rows.length) { return res.send(404); }
res.render('article', { title: rows[0].title, blog: rows[0] });
})
但是如果你真的想要缓存条目:
如果您想要真正的缓存,请使用redis
或memcached
。例如。如果你担心被抨击或者现在称之为什么。这需要一个Redis或Memcache守护进程,并且需要更多参与。
在您的代码中,SQL查询不会强制使用ORDER。获取具有特定ID的文章的唯一方法是遍历全局entry
数组,查看每个数据,直到找到正确的数据。
添加ORDER BY
子句无济于事,因为您仍然可以跳过ID(或稍后删除具有特定ID的条目)。你仍然需要遍历整个数组才能找到你想要的那个。
如果您已完成使用数据库,则可以致电connection.end
。但是,如果您的应用程序“永远”运行并且您计划不时访问数据库,则无需调用它。如果/当您的应用程序被杀死时,连接将被终止。更简洁的方法是让mysql
模块为您管理连接。请参阅文档部分“Pooling connections”。