exports.fnList = function(req, res){ }; exports.fnGet = function(req, res){ }; exports.fnDelete = function(req, res){ }; exports.fnUpdate = function(req, res){ }; exports.fnAdd = function(req, res){ };
在app.js文件中,需要把HTTP请求路由给对应函数。
var leaderboards = require('./routes/leaderboards'); … app.get('/leaderboards', leaderboards.fnList); app.get('/leaderboards/:id', leaderboards.fnGet); app.delete('/leaderboards/:id', leaderboards.fnDelete); app.post('/leaderboards', leaderboards.fnAdd); app.put('/leaderboards/:id', leaderboards.fnUpdate);
这样就把标准Web服务请求路由到leaderboards处理。因为请求中带有POST数据,可以使用
var bodyParser = require('body-parser'); // parse various different custom JSON types as JSON app.use(bodyParser.json({ limit: '1mb',type: 'application/*' }));
把请求的JSON结构解析后添加到req.body中。Limit是为避免非法数据占用服务器资源,正常情况下,如果解析JSON数据,type应该定义为'application/*+json',在本应用里,为避免某些客户端请求不指明类型,把所有输入都解析为JSON数据了。
'body-parser'是一个很有用的库,可以解析各种类型的HTTP请求数据,包括处理文件上传,详细可以参见https://www.npmjs.com/package/body-parser。
有了这个路由映射机制,我们不再需要考虑URL和数据的解析,仅仅指定路由,实现对应函数就可以了。
exports.fnList = function(req, res){ var result= {code:ErrCode.OK,comment: 'OK'}; try { var records= []; var topTen = db('leaderboards') .chain() .sortBy('score') .take(10) .map(function(record) { records.push(record); }) .value(); res.end(JSON.stringify(records)); }catch (err) { result.comment= 'Can\'t get leaderboards, Error: '+ err.message; result.code= ErrCode.DataError; console.log(result.comment); res.end(JSON.stringify(result)); } return; };
对类似:3000/leaderboards/aaa的URL,express已经解析到req.param里了,可以通过req.param('id')得到。
exports.fnDelete = function(req, res){ var result= {code:ErrCode.OK,comment: 'OK'}; try { var resID= req.param('id'); db('leaderboards').remove(resID); res.end(JSON.stringify(result)); console.log('delete record:'+ req.param('id')); } catch (err) { result.comment= 'Can\'t DELETE at '+ req.param('id')+ ', Error: '+ err.message; result.code= ErrCode.DelError; console.log(result.comment); res.end(JSON.stringify(result)); } };
使用了bodyParser.json()后,对POST请求中的JSON数据,已经解析好放到req.body里了,代码中可以直接使用。
function processCmd(req, res){ var result= {code:ErrCode.OK,comment: 'OK'}; try{ var command = req.body; console.log(req.bodyNaNd+ ';'+ req.body.record.id+ ':'+ req.body.record.score+ '('+ req.body.record.token+ ')'); if (commandNaNd === CMD.UPDATE_SCORE){ addRecord(command.record,result); console.log('add record:'+ command.record.id); } else if (commandNaNd === CMD.DEL_USE){ db('leaderboards').remove({id:command.record.id}); console.log('delete record:'+ command.record.id); } res.end(JSON.stringify(result)); } catch (err) { result.comment= 'Can\'t accept post, Error: '+ err.message; result.code= ErrCode.DataError; console.log(result.comment); res.end(JSON.stringify(result)); } return; } exports.fnUpdate = function(req, res){ processCmd(req,res); }; exports.fnAdd = function(req, res){ processCmd(req,res); };
使用express的好处是有一些细节可以扔给框架处理,代码结构上也更容易写得清晰一些。