DevGang
Авторизоваться

Создание Slackbot для регистрации действий приложения Node.js 

Slack - это облачная платформа для обмена мгновенными сообщениями, разработанная для компаний, которая дополняет электронную почту в качестве способа связи и обмена данными. Он также имеет интересные функции, такие как отправка сообщений на канал с помощью его веб-перехватчиков.

Веб-перехватчики - это автоматические полезные данные, отправляемые из приложений, когда что-то происходит. По сути, это способ, которым приложения могут отправлять автоматические сообщения или информацию в другое приложение.

В этой статье мы создадим Slackbot, который будет регистрировать все действия, которые происходят в нашем приложении с помощью Node.js. Наш бот будет регистрировать все действия, которые происходят в нашем приложении Node.js, включая ошибки, который мы скоро создадим.

Предпосылки

  1. Базовое знакомство с JavaScript
  2. Node.js установлен на вашем компьютере разработки
  3. MongoDB установлен на вашем компьютере разработки
  4. Базовое понимание REST API

Настройка проекта

Прежде чем мы начнем создавать нашего бота, мы должны создать простое приложение Node.js, в котором пользователи могут создать учетную запись и войти в нее. Наш бот войдет в систему, когда пользователь создаст учетную запись; при возникновении ошибки при создании учетной записи; когда пользователь входит в систему с правильными учетными данными; и когда пользователь попытался войти в систему с неправильными учетными данными.

Мы будем использовать генератор Express для создания нового приложения Express, а затем мы установим все необходимые зависимости, которые потребуются для нашего приложения. Для этого откройте свой терминал и введите следующее:

npx express-generator --no-view

После создания шаблона приложения запустите npm install, чтобы установить зависимости проекта.

npm i axios bcrypt cors jsonwebtoken mongoose dotenv

После их установки вы измените свой файл app.js следующим образом:

require('dotenv').config()
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({
    extended: false
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
require("./config/mongoose")(app);

app.use('/', indexRouter);
app.use('/users', usersRouter);
module.exports = app;

Теперь нам нужно настроить Mongoose для нашего приложения. Создайте файл config/mongoose.js и добавьте следующий код:

const mongoose = require("mongoose");
module.exports = app => {
    mongoose.connect("mongodb://localhost:27017/slackbot", {
        useUnifiedTopology: true,
        useNewUrlParser: true,
        useFindAndModify: false
    }).then(() => console.log("conneceted to db")).catch(err => console.log(err))
    mongoose.Promise = global.Promise;
    process.on("SIGINT", cleanup);
    process.on("SIGTERM", cleanup);
    process.on("SIGHUP", cleanup);
    if (app) {
        app.set("mongoose", mongoose);
    }
};
function cleanup() {
    mongoose.connection.close(function () {
        process.exit(0);
    });
}

Запустив npm start вы должны увидеть connected to db, что означает именно то, что вы думаете.

Теперь давайте настроим наши модели и контроллеры для приложения. Создайте файл models/users.js и добавьте следующее:

const mongoose = require("mongoose");
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");
const Schema = mongoose.Schema;
const userSchema = new Schema({
    name: {
        type: String,
        required: true,
    },
    password: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true,
    },
}, {
    timestamps: true,
});

userSchema.methods.hashPassword = async password => {
    return await bcrypt.hashSync(password, 10);
}
userSchema.methods.compareUserPassword = async (inputtedPassword, hashedPassword) => {
    return await bcrypt.compare(inputtedPassword, hashedPassword)
}
userSchema.methods.generateJwtToken = async (payload, secret, expires) => {
    return jwt.sign(payload, secret, expires)
}
module.exports = mongoose.model("User", userSchema);

Здесь мы создаем простую схему Mongoose для нашей пользовательской модели и определяем функции, которые будут хешировать пароль пользователя, сравнивать пароль пользователя, а также генерировать токен JWT, если учетные данные пользователя верны.

Мы также создадим файл controllers/users.js и добавим в него следующий код:

const User = require("../models/user");
exports.createNewUser = async (req, res) => {
    try {
        const user = new User({
            name: req.body.name,
            email: req.body.email,
            phone_number: req.body.phone_number,
            role: req.body.role
        });
        user.password = await user.hashPassword(req.body.password);
        let addedUser = await user.save()
        res.status(200).json({
            msg: "Your Account Has been Created",
            data: addedUser
        })
    } catch (err) {
        console.log(err)
        res.status(500).json({
            error: err
        })
    }
}
exports.logUserIn = async (req, res) => {
    const {
        email,
        password
    } = req.body
    try {
        let user = await User.findOne({
            email: email
        });
        //check if user exit
        if (!user) {
            return res.status(400).json({
                type: "Not Found",
                msg: "Wrong Login Details"
            })
        }
        let match = await user.compareUserPassword(password, user.password);
        if (match) {
            let token = await user.generateJwtToken({
                user
            }, "secret", {
                expiresIn: 604800
            })
            if (token) {
                res.status(200).json({
                    success: true,
                    token: token,
                    userCredentials: user
                })
            }
        } else {
            return res.status(400).json({
                type: "Not Found",
                msg: "Wrong Login Details"
            })
        }
    } catch (err) {
        console.log(err)
        res.status(500).json({
            type: "Something Went Wrong",
            msg: err
        })
    }
}

Это основные функции для создания учетной записи пользователя и входа пользователя в систему.

Мы должны изменить наш файл routes/user.js, чтобы получит контроллеры, которые мы создали:

var express = require('express');
const controller = require('../controllers/user')
var router = express.Router();
/* GET users listing. */
router.get('/', function (req, res, next) {
  res.send('respond with a resource');
});

router.post('/register', controller.createNewUser)
router.post('/login', controller.logUserIn)


module.exports = router;

Вы можете использовать POSTMAN для проверки вашего входа в систему и регистрации маршрутов.

Создание Slackbot

Прежде чем мы начнем создавать нашего бота, мы должны создать новое Slack-приложение. Зайдем https://api.slack.com и убедитесь, что вы вошли в систему. Нажмите на кнопку Start Building, которая отправить вас на страницу с запросом, чтобы дать боту имя и указать рабочую область, в которую вы хотите интегрировать его.

После настройки перейдите к маршруту входящих веб-перехватчиков и активируйте его:

Нам понадобится URL-адрес веб-перехватчика для связи с нашей рабочей областью.

Нажмите кнопку «Add New Webhook to Workspace». Вам будет предложено выбрать канал для отправки сообщений от бота. Выберите желаемый канал и нажмите кнопку «Разрешить»:

Клик по Allow сгенерирует URL-адрес веб-перехватчика для нашего приложения. Мы можем скопировать его и сохранить в нашем файле .env:

HOOK=<hook>

Не забудьте добавить свой файл .env в .gitignore.

Теперь создайте файл util/bot.js - здесь мы настроим нашего бота. У нас будет функция, которая отправляет запрос в наш Slack API. Эта функция принимает два параметра: error и payload.

Чтобы отправлять сообщения с URL-адресом вашего веб-перехватчика, мы отправим полезную нагрузку (будь то ошибка или фактическая полезная нагрузка) в JSON в качестве тела запроса application/json POST. Здесь на помощь приходит Axios.

Измените свой файл bot.js таким образом:

const axios = require("axios");
const hook = process.env.HOOK;
exports.sendNotificationToBotty = async (error, log) => {
    try {
        let slackbody;
        if (log) {
            slackbody = {
                mkdwn: true,
                attachments: [{
                    pretext: "Booty Notification",
                    title: "Activity Log",
                    color: "good",
                    text: log,
                }, ],
            };
        } else if (error) {
            slackbody = {
                mkdwn: true,
                attachments: [{
                    pretext: "Booty Notification",
                    title: "Error Notification",
                    color: "#f50057",
                    text: error,
                }, ],
            };
        }
        await axios.post(
            `https://hooks.slack.com/services/${hook}`,
            slackbody
        );
    } catch (err) {
        console.log(err);
    }
};

Теперь мы можем использовать это в нашем приложении. Мы используем вложения сообщений, предоставленные Slack, для отображения наших сообщений.

Итак, теперь мы должны добавить этот модуль в наш файл controllers/user.js, чтобы наш бот мог отправлять пользовательские сообщения, когда происходит действие. Измените файл controllers/user.js так:

const User = require("../models/user");
const bot = require("../util/bot")
exports.createNewUser = async (req, res) => {
    try {
        const user = new User({
            name: req.body.name,
            email: req.body.email,
            phone_number: req.body.phone_number,
            role: req.body.role
        });
        user.password = await user.hashPassword(req.body.password);
        let addedUser = await user.save()
        await bot.sendNotificationToBotty(null, `${addedUser.name} Just Created an account with Email as ${addedUser.email}`)
        res.status(200).json({
            msg: "Your Account Has been Created",
            data: addedUser
        })
    } catch (err) {
        console.log(err)
        res.status(500).json({
            error: err
        })
    }
}
exports.logUserIn = async (req, res) => {
    const {
        email,
        password
    } = req.body
    try {
        let user = await User.findOne({
            email: email
        });
        //check if user exit
        if (!user) {
            await bot.sendNotificationToBotty(`Login Attempt with Invalid Credentials ${email} as Email and ${password} as Password`)
            return res.status(400).json({
                type: "Not Found",
                msg: "Wrong Login Details"
            })
        }
        let match = await user.compareUserPassword(password, user.password);
        if (match) {
            let token = await user.generateJwtToken({
                user
            }, "secret", {
                expiresIn: 604800
            })
            if (token) {
                await bot.sendNotificationToBotty(null, `${user.name} Just Logged in`)
                res.status(200).json({
                    success: true,
                    token: token,
                    userCredentials: user
                })
            }
        } else {
            await bot.sendNotificationToBotty(`Login Attempt with Invalid Credentials ${email} as Email and ${password} as Password`)
            return res.status(400).json({
                type: "Not Found",
                msg: "Wrong Login Details"
            })
        }
    } catch (err) {
        await bot.sendNotificationToBotty(`An Error Occured`)
        console.log(err)
        res.status(500).json({
            type: "Something Went Wrong",
            msg: err
        })
    }
}

Теперь, когда новый пользователь создает учетную запись, бот отправляет имя пользователя и адрес электронной почты на канал, и то же самое происходит, когда пользователь входит в систему.

Сообщение об ошибке будет отправлено при возникновении ошибки, например, когда пользователь пытается войти в систему с неверными данными для входа.

Вывод

Ведение журнала - важная часть любого приложения, к которому следует относиться серьезно. В этой статье мы узнали, как использовать веб-перехватчики Slack в нашем настраиваемом приложении Node.js. С его помощью можно создавать более интересные приложения. 

Полный код:

Источник:

#NodeJS
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

Оплатив хостинг 25$ в подарок вы получите 100$ на счет

Получить