【问题标题】:node.js - How to extend mysql results objectnode.js - 如何扩展 mysql 结果对象
【发布时间】:2012-07-09 23:15:44
【问题描述】:

我是一个长期的 PHP 开发人员,今天决定给 node.js 并表达一个尝试。我正在尝试找到将结果合并到单个对象中的最佳方法。我可能会像 PHP 开发人员一样接近这一点,并且可以使用一些帮助。提前致谢。

app.get('/api/posts', function(req, res) {
    url_parts = url.parse(req.url, true)
    query = url_parts.query
    current_page = query.page || 1
    items_per_page = 50
    start_index = (current_page - 1) * items_per_page
    max_page = 1000

    var getPosts = {
        db: function() {
            var posts = {}
            connection.query('SELECT COUNT(*) AS count FROM rss', function(err, rows1, fields) {
                if (!err)
                {
                    total_pages = Math.ceil(rows1[0].count / items_per_page)

                    if (start_index < rows1[0].count || start_index < max_page)
                    {
                        sql = 'SELECT id, title, image, width, height, url FROM rss ORDER BY date DESC LIMIT '+start_index+', '+items_per_page
                        connection.query(sql, function(err, rows2) {
                            if (!err)
                            {
                                for (var i in rows2)
                                {
                                    comments = 'SELECT comment FROM comments WHERE section_id = '+rows2[i].id+' ORDER BY date DESC'
                                    connection.query(comments, function(err2, rows3) {
                                        //COMBINE RESULTS HERE
                                        //rows2[i].comments = rows3
                                    });
                                }

                                //res.json(rows2)
                               // DISPLAY RESULTS HERE
                            }
                            else
                            {
                                console.log(err)
                            }
                        });
                    }
                }
                else
                {
                    console.log(err)
                }
            });
        }
    }

    getPosts.db();
});

【问题讨论】:

    标签: mysql node.js node-mysql


    【解决方案1】:

    无论您做什么,都不要使用 Node.js 创建循环。这只会创建一个阻塞调用。您需要使用回调。您可以手动执行这些操作,也可以使用有帮助的库。我喜欢异步(https://github.com/caolan/async),所以这里用异步替换循环代码。

        async.forEachSeries(rows1, function(row, callback) {
    
           sql = 'SELECT id, title, image, width, height, url FROM rss ORDER BY date DESC LIMIT '+start_index+', '+ items_per_page
           connection.query(sql, function(err, rows2) {
               if (!err) {
                   async.forEachSeries(rows2, function(row2, callback2) {
                          // do whatever processing you will do here.
                          // now call the callback2 to signal you have finished processing.
                          callback2();
                   },function(err) {
                          // handle any errors that might occur in your 'loop' here.
                   });
               }
        callback()
    },function(err) {
    
    
    });
    

    对您的代码的另一个建议是您永远不应该手动构建您的 SQL。利用 ?参数。例如:

    connection.query("SELECT id, title, image, width, height, url FROM rss ORDER BY date DESC LIMIT ?,?", [start_index, items_per_page], function(err, rows, fields) {
    ...do your processing
    }
    

    希望这会有所帮助。

    【讨论】:

    • 关于循环的建议很糟糕。需要时使用循环。只要确保您不会迭代数百万个项目或在循环内执行复杂的操作。如果您需要这样做,请考虑使用队列/消息系统,您可以在其中在另一个工作进程中执行该工作。
    【解决方案2】:

    AlexGrad 使用异步模块是正确的,它将帮助您更好地组织代码(并且还可以帮助阻止事件循环,但这里不太可能出现这种情况)。您还应该按照他的建议使用? 字符进行转义。

    对于您的实际问题,通过将结果添加为临时属性来组合结果很好。

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2015-05-04
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多