前言
刚开始学习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)。文章若有错误之处,欢迎指正。
网友评论