Node.js串連MySQL資料庫及構造JSON的正確姿勢

來源:互聯網
上載者:User

標籤:

做一下整理,以前也很隨意的引入包連結資料庫,後來發現常常串連出問題,異常退出,後來使用在網上一個方法解決問題,網址由於書籤丟失,抱歉不能引用了。再有就是簡單的模組化下,使得目錄合理點,再有就是說明一下,標題有賺眼球的嫌疑,代碼我這裡使用正常,而且我覺得也蠻好用,不過不代表真的就是該這麼寫,畢竟我還是個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/datamodule.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,可以了,如果大家發現我寫的哪裡有問題,記得通知我哦,感激不盡

 

Node.js串連MySQL資料庫及構造JSON的正確姿勢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.