【问题标题】:How to save mysql query in a global array in Node.js [duplicate]如何将mysql查询保存在Node.js的全局数组中[重复]
【发布时间】:2014-01-21 10:41:55
【问题描述】:

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

【问题讨论】:

    标签: javascript html mysql node.js express


    【解决方案1】:

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

    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”。

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2018-07-25
      • 2015-06-05
      • 2014-11-23
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多