node express+mysql搭建簡易API服務—body-parser中間件

最近用express搭建了一個簡單的RESTful風格的API服務,數據庫使用mysql,主要用於獲取數據庫數據,模糊搜索等。javascript

須要用到的模塊:html

  • express:這個都很熟悉了;
  • body-parser:express中間件,用來解析req.body;
  • mysql:用於鏈接mysql數據庫;
1. express啓動文件,prod.server.js:
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');
});
2. 鏈接數據庫,mysqlServer.js:
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();
};
3. 須要注意的是

這裏若是就按照我上面這種寫法,應該是獲取不到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-parsermysql

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
4. body-parser應用場景

body-parser這兩種用法基本覆蓋了全部的應用場景,後定義的不會覆蓋先定義的,經解析後獲取到的都是json格式的對象,剛開始我沒寫 app.use(bodyParser.urlencoded({ extended: true})); 這一句,req.body能夠獲取到可是爲空對象,這是由於前端提交的默認數據格式是Content-Type:application/x-www-form-urlencoded; charset=UTF-8,所以還須要作進一步解析。sql

到如今爲止,就能夠正常調用這個API服務了。數據庫

相關文章
相關標籤/搜索