2013年11月15日 星期五

[node.js] express.js add ip / path filter middleware

前陣子因為有一個不同目錄限制不同IP可以連線的需求,所以研究了一下寫出這個小功能來,在這邊分享一下,因為沒啥空就懶得寫英文版了,希望老外看得懂。

基本上就是做到可以指定多個目錄分別對多個IP做到限制連線的功能,如何設定多目錄可以看config.js那段
寫得不複雜,也還沒加上sub mask 或是 192.168.1.* 之類的功能,等有需要再加吧

middleware\ipFilter.js

var config = require('../config');
var enabled = true;

module.exports = function(onoff) {
    enabled = (onoff == 'on') ? true : false;
    var IParr = config.IPFilter;
    return function(req, res, next) {
        if(enabled && IParr.length>0){
            for(var index in IParr){
                var inArea = false;
                for(var pa in IParr[index].path){
                    inArea = (req.path.indexOf(IParr[index].path[pa])>-1)?true:inArea;
                }
                if(inArea) {
                    if (IParr[index].ip.indexOf(req.connection.remoteAddress) == -1) {
                        console.log('Banned IP from '+req.connection.remoteAddress);
                        res.end('Banned');
                    }
                }
            }
            next();
        }else{
            next();
        }
    };
};

where you setting Express.js

var express = require('express');
var ipfilter = require('./middleware/ipFilter.js');
var app = express();
app.use(ipfilter('on'));


config.js

exports.IPFilter =[
    {
        path:['/static/admin/','home/statistic/'],
        ip:['127.0.0.1','192.168.1.110','123.123.123.123']
    },
    {
        path:['/job/'],
        ip:['1.1.1.1','127.0.0.1','192.168.11.1']
    }
];

懶得打字,收工。

忘記寫了,我是參考這篇"How to Write Middleware for Connect / Express.js"的

2013年11月10日 星期日

柯文哲影片蒐集,更新至2013/12/21

KP

update to 2013/12/21


最近開始對柯文哲醫生有興趣,看了不少他的言論之後,發現柯文哲真的聰慧、獨特、真誠、充滿熱情,台灣真的需要有這種有能力的人來為台灣做點好事,就如他在新聞看透透內說的"改變台灣,從首都開始",我相當希望這個人可以上到可以做事的位子,改變台灣的社會,所以我想蒐集一些我找到的影片,讓大家更認識柯文哲醫生。

影片順序,我覺得在TED的演講很有意思,可以先看,剩下的按照時間順序排列放。

2013/09/28
[TEDxTaipei 2013] 生死的智慧




2013年11月4日 星期一

[MongoDB] 用aggregate做到大部分Select功能

在MongoDB中,要做到像之前SQL中一樣的查詢,簡單的還可以,複雜的可能就比較要花時間了,研究了一下後,找到MongoDB內有Aggregation Framework可以做到很多想用的操作,SQL to Aggregation Mapping Chart這篇文章中有很多範例了,基本上SQL中的WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, SUM, COUNT等操作,用aggregate都有方法代替,文章中已經有很多範例了,我再多寫幾個有用到的例子,這樣大部分別太複雜的查詢應該都足夠涵蓋了。

SQL
Mongo
SELECT MAX(price) AS 'max', 
       AVG(price) AS 'avg', 
       MIN(price) AS 'min' 
FROM dbo.orders
WHERE ord_date>='2013/10/1' 
      AND ord_date<'2013/11/1'
db.orders.aggregate([
  {$match: { ord_date:{  
    $gte:new Date('2013/10/1'),  
    $lt:new Date('2013/11/1')}}},
  {$group: { _id:null,
    max:{$max:'$price'},
    avg:{$avg:'$price'},
    min:{$min:'$price'}}}
])
SELECT TOP 20 
       cust_id, 
       status, 
       count(1) AS 'count' 
FROM dbo.orders
WHERE ord_date>='2013/10/1' 
      AND ord_date<'2013/11/1'
GROUP BY cust_id, status
ORDER BY 'count' DESC
db.orders.aggregate([
  {$match:{act:act,
    ord_date:{$gte:new Date('2013/10/1'),
      $lt:new Date('2013/11/1')}}},
  {$group:{
    _id:{cust_id:'$cust_id',
      status:'$status'},
    count:{$sum:1}}},
  {$sort:{count:-1}},
  {$limit:20}
])

SELECT status AS '_id', 
       sum(price) AS 'total' 
FROM dbo.orders
WHERE ord_date>='2013/10/1' 
      AND ord_date<'2013/11/1'
GROUP BY status
db.orders.aggregate([
  {$match: {
    ord_date:{$gte:new Date('2013/10/1'),
    $lt:new Date('2013/11/1')}}},
  {$group: {_id: '$status', 
    total: {$sum: '$price'}}}
])


其他範例在MongoDB的官方文件範例上都差不多有,我就不重複了,至於要用Join的方式我還沒試過,而更複雜的查詢就要用MapReduce了。

2013年11月1日 星期五

Mongoose ERROR : connection closed due to parseError

老實說我不太喜歡使用很多packages/plugins,有時候方便是方便,但是常常會帶來莫名的限制與找不出來原因的錯誤,或是要花不少時間去debug,通常一定會遇到的就是不敢升級....有些東西還是自己開發來的穩當,公司的技術還是要掌握在自己手中比較穩。

不過anyway,入境隨俗,既然我也不能決定,就只好用了,這次遇到是node.js的MongoDB套件"Mongoose"出的錯誤,就不提為何要用Mongoose來把原本schema-free的mongoDB搞回要schema了 -_-

錯誤是長這樣的
connection closed due to parseError

老實說,這錯誤訊息是很難看懂的,瞎試也很花時間,所以研究了一下,找到了下面這個地方。

mongoose error

在node_modules資料夾中搜尋"mongoReply.parseBody"。
Search "mongoReply.parseBody" in node_modules folder.


mongoose error help

將錯誤印出來幫助除錯。
console.log the err to help debug.

收工,終於有比較清楚的錯誤訊息了。