前言
剛開始學習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
短信簽名
短信通知模板ID
上面我們已經安裝了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)。文章若有錯誤之處,歡迎指正。