2016-02-29 116 views
4

在我的項目中,我需要使用分頁查詢數據庫併爲用戶提供基於當前搜索結果進行查詢的功能。有點像極限,我無法找到任何與nodejs一起使用的東西。我的後端是MySQL,我在寫一個休息API。使用mysql在nodejs中進行分頁

回答

6

你可以嘗試類似的東西(假設你使用Express 4.x)。

使用GET參數(這裏的頁面是你想要的頁面結果的數量,npp是每頁的結果數量)。

在此示例中,查詢結果在響應負載的results字段中設置,而分頁元數據在pagination字段中設置。

至於根據當前搜索結果進行查詢的可能性,您將不得不擴大一點,因爲您的問題有點不清楚,我想這就是爲什麼它已被低估(請試用用戶,善待新手和嘗試,而不是從一開始就把它們拒之門外!)。

var express = require('express'); 
var mysql = require('mysql'); 
var Promise = require('bluebird'); 
var bodyParser = require('body-parser'); 
var app = express(); 

var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'myuser', 
    password : 'mypassword', 
    database : 'wordpress_test' 
}); 
var queryAsync = Promise.promisify(connection.query.bind(connection)); 
connection.connect(); 

// do something when app is closing 
// see http://stackoverflow.com/questions/14031763/doing-a-cleanup-action-just-before-node-js-exits 
process.stdin.resume() 
process.on('exit', exitHandler.bind(null, { shutdownDb: true })); 

var bodyParser = require('body-parser'); 
app.use(bodyParser.urlencoded({ extended: true })); 

app.get('/', function (req, res) { 
    var numRows; 
    var queryPagination; 
    var numPerPage = parseInt(req.query.npp, 10) || 1; 
    var page = parseInt(req.query.page, 10) || 0; 
    var numPages; 
    var skip = page * numPerPage; 
    // Here we compute the LIMIT parameter for MySQL query 
    var limit = skip + ',' + skip + numPerPage; 
    queryAsync('SELECT count(*) as numRows FROM wp_posts') 
    .then(function(results) { 
    numRows = results[0].numRows; 
    numPages = Math.ceil(numRows/numPerPage); 
    console.log('number of pages:', numPages); 
    }) 
    .then(() => queryAsync('SELECT * FROM wp_posts ORDER BY ID DESC LIMIT ' + limit)) 
    .then(function(results) { 
    var responsePayload = { 
     results: results 
    }; 
    if (page < numPages) { 
     responsePayload.pagination = { 
     current: page, 
     perPage: numPerPage, 
     previous: page > 0 ? page - 1 : undefined, 
     next: page < numPages - 1 ? page + 1 : undefined 
     } 
    } 
    else responsePayload.pagination = { 
     err: 'queried page ' + page + ' is >= to maximum page number ' + numPages 
    } 
    res.json(responsePayload); 
    }) 
    .catch(function(err) { 
    console.error(err); 
    res.json({ err: err }); 
    }); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

function exitHandler(options, err) { 
    if (options.shutdownDb) { 
    console.log('shutdown mysql connection'); 
    connection.end(); 
    } 
    if (err) console.log(err.stack); 
    if (options.exit) process.exit(); 
} 

這裏是package.json文件,在這個例子中:

{ 
    "name": "stackoverflow-pagination", 
    "dependencies": { 
    "bluebird": "^3.3.3", 
    "body-parser": "^1.15.0", 
    "express": "^4.13.4", 
    "mysql": "^2.10.2" 
    } 
}