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

时间:2014-01-03 17:14:44

标签: javascript html mysql node.js express

我是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}}

1 个答案:

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

但是如果你真的想要缓存条目:

  • 如果您想要真正的缓存,请使用redismemcached。例如。如果你担心被抨击或者现在称之为什么。这需要一个Redis或Memcache守护进程,并且需要更多参与。

  • 在您的代码中,SQL查询不会强制使用ORDER。获取具有特定ID的文章的唯一方法是遍历全局entry数组,查看每个数据,直到找到正确的数据。

  • 添加ORDER BY子句无济于事,因为您仍然可以跳过ID(或稍后删除具有特定ID的条目)。你仍然需要遍历整个数组才能找到你想要的那个。

如果您已完成使用数据库,则可以致电connection.end。但是,如果您的应用程序“永远”运行并且您计划不时访问数据库,则无需调用它。如果/当您的应用程序被杀死时,连接将被终止。更简洁的方法是让mysql模块为您管理连接。请参阅文档部分“Pooling connections”。