最近用express搭建了一個簡單的RESTful風格的API服務,數據庫使用mysql,主要用於獲取數據庫數據,模糊搜索等。javascript
須要用到的模塊:html
const express = require('express'); const server = require('./mysqlServer'); let port = process.env.PORT || config.build.port; const app = express(); let router = express.Router(); router.get('/', (req, res, next) => { req.url = '/index.html'; next(); }); app.use(router); let apiRoutes = express.Router(); apiRoutes.get('/test', (req, res) => { server.getData('test', function(errCode, data){ res.json({ status: errCode, data: data }); }); }); apiRoutes.post('/search', function(req, res) { // console.log(req.body); server.doSearch(req.body.searchStr, function(errCode, data){ res.json({ status: errCode, data: data }); }); }); app.use('/api', apiRoutes); app.use(express.static('./dist')); module.exports = app.listen(port, function (err) { if (err) { console.log(err); return } console.log('Listening at http://localhost:' + port + '\n'); });
const mysql = require('mysql'); const DBConfig = { host: 'localhost', port: '3306', user: 'name', password: 'pwd', database: '數據庫名' }; exports.getData = function(type, callback) { ... }; exports.doSearch = function(str, callback) { let connection = mysql.createConnection(DBConfig); connection.connect(); let sql = "SELECT * FROM xxx WHERE name LIKE '%" + str + "%'"; // console.log(sql); connection.query(sql, function(err, result){ if(err) { console.log('[ERROR SQL] : ', sql); console.log('[SEARCH ERROR] - ', err.message); callback(0,[]); } let resultJson = JSON.parse(JSON.stringify(result)); callback(1,resultJson); }); connection.end(); };
這裏若是就按照我上面這種寫法,應該是獲取不到POST請求的body的,由於express 4.x官網也說了:前端
Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as body-parser and multer.java
這個意思是提交請求的req.body中的鍵值對,express接收過來默認是undefined,須要藉助中間件來作解析處理,因而便須要用到body-parser
。mysql
const bodyParser = require('body-parser'); app.use(bodyParser.json()); //for parsing application/json app.use(bodyParser.urlencoded({ extended: true})); //for parsing application/x-www-form-urlencoded
body-parser這兩種用法基本覆蓋了全部的應用場景,後定義的不會覆蓋先定義的,經解析後獲取到的都是json格式的對象,剛開始我沒寫 app.use(bodyParser.urlencoded({ extended: true}));
這一句,req.body能夠獲取到可是爲空對象,這是由於前端提交的默認數據格式是Content-Type:application/x-www-form-urlencoded; charset=UTF-8
,所以還須要作進一步解析。sql
到如今爲止,就能夠正常調用這個API服務了。數據庫