如何在Node.js的全局数组中保存mysql查询

我是Node.js和Express的新手。 我明白这些函数是asynchronous执行的,但是我不知道如何使用全局variables。 在这里,我连接到MySQL数据库,检索查询结果,并呈现在我的test.html页面上。 然后在mysql.js文件中,我想将这些结果保存在一个名为entry的数组中,以便另一个get()可以使用相同的结果。 我对Node.js有限理解的唯一select就是在另一个get()中再次查询数据库。 我怎样才能使用这个全局来保存我的查询结果从匿名函数? 还有什么事件和function,我可以执行我的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}} 

简单的方法是在请求时运行查询来检索每篇文章。 你的第一条路线( '/' )看起来很好。 只需为您的第二条路线添加一个类似的查询:

 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] }); }) 

但是如果你真的想caching条目:

  • 如果你想真正的caching使用redismemcached 。 例如,如果你担心被斜杠或现在叫什么。 这需要一个Redis或Memcache守护进程,并且涉及更多一点。

  • 在你的代码中,SQL查询不会强加一个ORDER。 获取具有特定ID的文章的唯一方法是遍历全局entry数组,直到find合适的ID。

  • 添加ORDER BY子句没有帮助,因为您仍可以跳过一个ID(或稍后使用特定ID删除一个条目)。 你仍然需要遍历整个数组来find你想要的。

如果您使用数据库完成,则可以调用connection.end 。 但是,如果您的应用程序“永远”运行,并且您计划不时访问数据库,则无需调用它。 如果/当你的应用程序被杀害,连接将被杀死。 一个更清洁的方法是让mysql模块pipe理你的连接。 请参阅文档部分“ 池连接 ”。