Node.js連接MySQL數據庫及構造JSON的正確姿勢


做一下整理,以前也很隨意的引入包鏈接數據庫,后來發現常常連接出問題,異常退出,后來使用在網上一個方法解決問題,網址由於書簽丟失,抱歉不能引用了。再有就是簡單的模塊化下,使得目錄合理點,再有就是說明一下,標題有賺眼球的嫌疑,代碼我這里使用正常,而且我覺得也蠻好用,不過不代表真的就是該這么寫,畢竟我還是個node菜鳥,大神路過有更好的方式方法,還請留下腳印,感激不盡!

Node版本:v0.10.34

Express版本:4.9.0

在繼續進行之前,假設你搭建的本地環境已經可以看到這個界面:

--------------------------------------------------------------------------------------------------------

好了,繼續進行。首先,看一下我的目錄:

controllor目錄和setting.js是新建的,下面放些處理功能,比如操作數據庫的database.js,和用於處理數據,返回JSON的dd_tongji.jssettings.js用於存儲一些配置信息

如果新建的工程,那么需要在路由(routers/index.js)中添加兩行代碼來引入我們的模塊和配置URL

var express = require('express');
var router = express.Router();
var dd_tongji = require('../controller/dd_tongji.js'); //引入自定義模塊

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

router.get('/data', dd_tongji.get_click); //配置RUL,訪問http://localhost:3000/data

module.exports = router;

然后添加如下代碼到controller/dd_tongji.js

exports.get_click = function(req, res) {
  return res.jsonp({"hello":"world"});
};

重啟服務后訪問:http://127.0.0.1:3000/data

這樣,后端的工作就是這樣了,前台訪問這個網址就可以獲取數據了~

- 說好的數據庫呢?說好的構造JSON呢?

- 別急,且往下看

----------

(一)Node.js連接MySQL數據庫

dd_tongji.js中我們想引入MySQL中的數據,處理成我們想要的JSON格式,好,來看下database.js中的內容:

var mysql = require('mysql'),
    settings = require('../settings');

module.exports.getConnection = function () {
    if ((module.exports.connection) && (module.exports.connection.socket) && (module.exports.connection._socket.readable) && (module.exports.connection._socket.writable)) {
        return module.exports.connection;
    }
    console.log(((module.exports.connection) ? "UNHEALTHY SQL CONNECTION; RE" : "") + "CONNECT TO SQL.");
    var connection = mysql.createConnection({
            host: settings.mysql.host,
            port: settings.mysql.port,
            database: settings.mysql.database,
            user: settings.mysql.user,
            password: settings.mysql.password,
            charset: "utf8"
    });
    connection.connect(function (err) {
            if (err) {
                console.log("SQL CONNECT ERROR: ", err);
            } else {
                console.log("SQL CONNECT SUCCESSFUL.");
            }
    });
    connection.on("close", function(err) {
            console.log("SQL CONNECTION CLOSED.");
    });
    connection.on("error", function(err) {
            console.log("SQL CONNECTION ERROR: ." + err);
    });
    module.exports.connection = connection;
    return module.exports.connection;
};

module.exports.getConnection();

數據庫的配置信息在settings.js中,我們已經通過settings = require('../settings');引入

看下settings.js的內容:

 

module.exports = {
mysql: {
          host: '127.0.0.1',
          port: 3306,
          user: 'user',
          password: '123456',
          database: 'mydata'
       }
}

 

dd_tongji.js中使用引入(部分代碼)

var connection = database.getConnection();
connection.query(sql, function(err, rows, fields) {
  ...//rows為查詢出的數據,可通過rows[i].字段 訪問數據
}

因為這里先說明的是引入數據庫,所以完整的dd_tongji.js代碼在構造JSON的時候再書寫

 

而且這種方式貌似是不需要關閉連接的。(忘了為什么了,抱歉...)

好了,數據庫部分先暫時這樣,一會兒會有示例演示取數據,拼接JSON,並返回。

 

(二)Node.js構造JSON

假使URL接口是http://127.0.0.1:3000/data?genus=DEFAULT&evt=ABOUT&begin=2014-09-09&end=2014-09-20

那么也就是說我們需要查詢的數據就是數據庫genus字段為DEFAULT,ent字段為ABOUT,日期為2014-09-09到2014-09-20期間的數據

看一下新的dd_tongji.js代碼:

var database = require('./database')

/* 傳入字符串獲取間隔的天數 */
function DateDiff(sDate1, sDate2){ //sDate1和sDate2是2002-12-18格式
  var aDate, oDate1, oDate2, iDays
  aDate = sDate1.split("-")
  oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0]) //轉換為12-18-2002格式
  aDate = sDate2.split("-")
  oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
  iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24) //把相差的毫秒數轉換為天數
  return iDays
}

/* 根據參數返回日期的字符串 */
function GetDateStr(BeginDate, AddDayCount) {
  var begin = Date.parse(BeginDate);
  var dd = new Date(begin);
  dd.setDate(dd.getDate()+AddDayCount);//獲取AddDayCount天后的日期
  var y = dd.getFullYear();
  var m = dd.getMonth()+1;//獲取當前月份的日期
  var d = dd.getDate();
  if(m<10) m = '0' + m;
  if(d<10) d = '0' + d;
  return y + "-" + m + "-" + d;
}

exports.get_click = function(req, res) {

  // console.log(DateDiff(req.query.begin, req.query.end));

  // 構造日期列表
  var datelist = []
  var BeginDate = req.query.begin;
  var EndDate = req.query.end;
  var DateNum = DateDiff(BeginDate, EndDate) + 1; // 需要查詢的日期天數
  for (var i=0; i<DateNum; i++) {
    time = GetDateStr(BeginDate, i);
    datelist.push(time)
  }

  console.log(datelist);
  console.log(datelist.length);

  // data 用於保存查詢到的數據
  var data = {};
 
  for(var i=0; i< datelist.length; i++) {
    data[datelist[i]] = {
      click_num: 0,
      people_num: 0,
      average_num: 0
    }
  }

  // 定義查詢語句
  var sql = "SELECT * FROM click WHERE genus='" + req.query.genus + "' AND evt='" + req.query.evt + "' and date>='" + req.query.begin + "' and date <='" + req.query.end + "'"
  console.log(sql);

  // 連接數據庫
  var connection = database.getConnection();
  connection.query(sql, function(err, rows, fields) {
    if (err) throw err;

    for(var i=0; i < rows.length; i++) {
      data[rows[i].date] = {
        click_num: rows[i].click_num,
        people_num: rows[i].people_num,
        average: rows[i].average
      }
    }

    var result = {
      genus: req.query.genus,
      evt: req.query.evt,
      data: data
    }

    return res.jsonp(result);
  });
};

不多講解了,例子還是很好理解的,data初始化操作是為了填補有些日期沒有數據的問題。

來看下數據庫中的表結構和JSON的結果

OK,可以了,如果大家發現我寫的哪里有問題,記得通知我哦,感激不盡

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM