美文网首页技术干货
Nodejs写一个简单的监听服务器程序

Nodejs写一个简单的监听服务器程序

作者: 漫漫前端 | 来源:发表于2017-01-20 11:01 被阅读0次

    前言

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

    相关文章

      网友评论

        本文标题:Nodejs写一个简单的监听服务器程序

        本文链接:https://www.haomeiwen.com/subject/dmpibttx.html