Nodejs寫一個簡單的監聽服務器程序

前言

剛開始學習nodejs,邊看書邊敲代碼,寫了一個簡單的服務器監聽程序,希望能對Node新手有幫助,OK,進入正文。
程序的功能很簡單,監聽某個服務器,如果服務器無法訪問則發郵件和短信通知服務器宕機,如果修復好了發短信通知。
用到的模塊或插件

  • node和npm(基礎,沒有安裝的趕緊裝一下吧)
  • nodemailer(node發送郵件)
  • alidayu-node(阿里大于短信服務)

開始

首先在node下安裝相關服務

npm install nodemailer alidayu --save

新建app.js,引入http模塊

var http = require('http');

現在我們要使用node內置的http模塊

//為了方便我在自己電腦使用node起了一個端口3000的本地服務
var options = {
    hostname: 'localhost',//這里可以填入你要監控的服務器url
    port: '3000',
    path: '/',
    method: 'GET'
};

var addcheck = true;//定義一個開關
http.request(options,function(){
     //發送郵件的代碼
})
//當請求網站返回錯誤,也就是網站不可訪問時的處理代碼
http.on('error',function(){
      
})

郵件功能

基礎搭建好了,我們要開始填充發送郵件的代碼了.首先使用nodemailer配置客戶端。這里以QQ郵箱為例

//引入模塊
var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service:'qq',
    auth:{
        user:'xxxxxxx@qq.com',
        pass:'xxxxxxxxxxx'  //這里的pass不是你的QQ郵箱登錄密碼,而是第三方授權碼
    }
});
//定義服務器宕機和恢復時要發送的郵件格式
var errorOptions = {
    from: 'xxxxxxx@qq.com',
    to: 'xxxxxxx@163.com',
    subject:'工程掛掉了',
    text: '工程掛掉了,請盡快修復'
}
var restartOptions = {
    from: 'xxxxxxx@qq.com',
    to: 'xxxxxxxx@163.com',
    subject:'工程恢復',
    text:'服務器已恢復'
}

更多配置請參考nodemailer文檔

現在我們要在上面http模塊的基礎上添加發送郵件功能了

var addcheck = true;//定義一個開關
http.request(options,function(){
    if(!addcheck){
            //發送郵件的代碼
            transporter.sendMail(restartOptions,function(){
                    //回調函數
            })
            addcheck = true;
    }
})
//當請求網站返回錯誤,也就是網站不可訪問時的處理代碼
http.on('error',function(){
      if(addcheck){
            transporter.sendMail(errorOptions,function(){
                    //回調函數
            });
            addcheck = false;
      }
})

上面代碼的意思是首先定義開關,然后用http去監聽我們配置好的服務器設置,如果error,同時addcheck為true時,調用nodemailer發送宕機郵件,同時addcheck為false.
如果監聽恢復正常,同時addcheck為false(也就是說當前服務器已經宕機一次),則發送恢復郵件通知服務器已經正常。同時addcheck為true.

短信服務

短信接口我們調用阿里大于的nodejs短信接口,alidayu-node模塊簡介
首先我們登陸阿里大于,申請應用,拿到App Key和 App Secret以及相關的接口。

App key和App Secret


Paste_Image.png

短信簽名


Paste_Image.png

短信通知模板ID


Paste_Image.png

上面我們已經安裝了alidayu-node模塊,直接引入

var App = require('alidayu-node');
var app = new App('App Key','App Secret');//這里的App Key和App Secret 就是我們上面拿到的

app.smsSend({
        sms_free_sign_name: '通知',//這里就是上面的簽名
        sms_param: {"code": "123456", "product": "測試網站"},//這里是短信模板變量,可選
        rec_num: '13599999999',//要發送的手機號,可以有多個
        sms_template_code: 'SMS_640004'//短信模板ID
})

OK,將我們上面寫好的短信通知代碼段放到http代碼段下,同時我們使用setInterval去重復調用

var timer = setInterval(function(){
    var req = http.request(options,function(res){
                if(!addCheck){
                    transporter.sendMail(restartOption,function(err,res){
                        if(err){
                            console.log(err);
                        }
                        else{
                            console.log(req.messageId);
                        }
                        addCheck = true;
                    })
                }
                console.log(res.statusCode);
            })

    req.on('error',function(err){
                if(addCheck){
                    transporter.sendMail(errorOptions,function(){
                        console.log(new Date() + '工程掛掉了');
                    });
                    app.smsSend({
                            sms_free_sign_name:'通知',
                            rec_num:'13999999999',
                            sms_template_code:'SMS_42675072'
                        },function(err,res){
                         //回調,可選,我這里方便調試加了回調
                            if(err){
                                console.log(err);
                            }
                            else{
                                console.log(res);
                            }
                        });
                    addCheck = false;
                }
            })

    req.end();
},60000);

然后在shell中啟動,測試代碼是否能正常工作

node app.js

如果我們部署在服務器上,關掉終端那么服務也就停止了,這里我們可以使用PM2進程管理軟件來不間斷啟動服務。關于PM2的介紹

參考

通過阿里大魚平臺用nodejs發短信
史上最“腦殘”的“搶火車票”程序(node.js版)

正文結束,第一次在簡書寫文章,心情有點小激動(hiahia)。文章若有錯誤之處,歡迎指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,881評論 18 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,382評論 0 6
  • 2017.7.25---8.3日,跟著一群孩子和他們的導師,北游鄂爾多斯,借名莊子外篇曰知北游。路途雜記,...
    圣誕來了天使閱讀 1,983評論 8 19
  • 我的父親 @黃開兵 一說起自己的父親,很多人都會想到這些詞:慈祥,嚴肅,憨厚,一家之主,頂梁柱……而對于我來說,都...
    黃開兵閱讀 955評論 5 13
  • 最近讀了本有趣的書,臺灣作家駱以軍的《小兒子》。作家有兩個性格迥異的兒子,而書名“小兒子”并不是單指第二個兒子,英...
    加加媽媽閱讀 833評論 1 4