0

私は長い間 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();
});
4

2 に答える 2

1

何をするにしても、Node.js でループを作成しないでください。それは単にブロッキングコールを作成します。コールバックを使用する必要があります。それらを手動で行うか、役立つライブラリを使用できます。私はasyncが好きなので(https://github.com/caolan/async)、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) {


});

コードに関するもう 1 つの提案は、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
}

お役に立てれば。

于 2012-07-04T13:15:02.697 に答える
1

AlexGrad は async モジュールの使用について正しく、コードをより適切に整理するのに役立ちます (また、イベント ループをブロックするのにも役立ちますが、ここではほとんどそうではありません)。?また、キャラクターをエスケープに使用することについての彼のアドバイスに従う必要があります。

実際の質問については、結果をアドホック プロパティとして追加して組み合わせても問題ありません。

于 2012-07-09T15:15:44.710 に答える