Nodejs笔记整理02

馋奶兔 提交于 2019-12-09 12:25:19

一 发邮件

a.$ npm init -y
b.$ npm i nodemailer --save
c.$ node_modules,里面的well_known,services.json找到端口,若是qq邮箱发送的,就在services.json里面搜索到,不同邮箱对应的主机端口号
d. 邮箱设置里面,配置 使用默认的SMTP传输方式 ,SMTP服务开启(hgiolupvgamtbdha)

> auth: {
>      user: user.name, 
>      pass: user.pass 
}//改成
const user = {
name: "1402749545@qq.com",
pass: "jecwayfxjryuhacf"
}

 auth: {
    user: user.name, //用户名
    pass: user.pass 密码
}

二 发邮件代码

//使用默认的SMTP传输方式 创建可复用的传输对象
let transporter = nodemailer.createTransport({
    host: "smtp.qq.com", //主机名
    port: 465, // 端口号
    secure: true, // true for 465, false for other ports
    auth: {
        user: user.name, // generated ethereal user  用户名
        pass: user.pass // generated ethereal password  密码
    }
});

let emailObj = {
    from: '"Fred Foo 👻" <1402749545@qq.com>', // sender address
    to: "jxsrzj0325@163.com", // list of receivers
    subject: "Hello ✔", // Subject line  抄送
    // text: "Hello world?", // plain text body  发送的文本内容
    html: "<b>Hello world?</b>" // html body  发送的html内容
};

// send mail with defined transport object
// setInterval(function() {
let info = transporter.sendMail(emailObj, (err, data) => {
    if (err) console.log(err);
    console.log(data);
});
http.createServer((req, res) => {

    if (req.url == "/favicon.ico") return;
    console.log(`${req.method} ${req.headers.host}${req.url}`);

    res.writeHead(200, {
        'content-type': 'text/html;charset=utf-8'
    });

    let promise = null;
    if (req.method === "GET") {
        switch (req.url) {
            case '/reg':
                promise = file.readFile('public', 'html', 'reg.html');
                break;

        }
        promise.then((data) => {
            res.end(data);
        }).catch((err) => {
            console.log(err);
        });
    } else {
        switch (req.url) {
            case '/getmail':
                req.on('data', chunk => {
                    let data = querystring.parse(chunk.toString());
                    let code = getCode(); // 获得验证码

                    // 设置邮件地址和内容
                    emailObj.to = data.email;
                    emailObj.html = `<h1>您的验证码是:${code}</h1>`;

                    // 发送邮件
                    let info = transporter.sendMail(emailObj, (err, val) => {
                        if (err) console.log(err);
                        // 成功后的操作
                        console.log(val);
                        file.writeFile(code, 'temp', data.email); // 写文件纪录验证码
                        res.end('验证码已发送');
                    });
                });
                break;
            case '/reg':
                req.on('data', chunk => {
                    let data = querystring.parse(chunk.toString());
                    file.readFile('temp', data.email).then((val) => {
                        if (data.code === val) {
                            res.end('{"msg":"验证码正确"}');
                            fs.unlink(`./temp/${data.email}`, err => {
                                if (err) console.log(err);
                                console.log('删除成功');
                            })
                        } else {
                            res.end('{"msg":"验证码错误"}');
                        }
                    });
                });
                break;
        }
    }


}).listen(8888, () => {
    console.log(`server is running on http://localhost:8888`);
});


function getRandom(min, max) {
    return Math.round(Math.random() * (max - min) + min);
}

function getCode() {
    let code = '';
    for (var i = 0; i < 6; i++) {
        var type = getRandom(1, 3);
        switch (type) {
            case 1:
                code += String.fromCharCode(getRandom(48, 57));
                break;
            case 2:
                code += String.fromCharCode(getRandom(65, 90));
                break;
            case 3:
                code += String.fromCharCode(getRandom(97, 122));
                break;
        }
    }
    return code;
}

三 事件

    const events = require('events');
    class MyEvent extends events {}
    let myev = new MyEvent();
    myev.on('sayHi', function() { // 监听 sayHi事件
        console.log('hi');
    });
    myev.emit('sayHi'); // 触发事件

五 async异步解决方案

学习过的异步操作

计时器 事件 ajax jsonp 文件操作

为什么要异步执行

因为JavaScript 的执行环境(JS引擎)是单线程

如果有多个任务 不能同时执行 依次执行

上一个任务完成之前 无法进行下一个任务 需要等待(阻塞操作)

异步指的是将任务放入事件队列 在主线程执行完毕后 开始执行

nodejs天生异步

nodejs 非阻塞i/o模型 eventloop机制

后台线程去处理所有的阻塞操作 处理结束 将结果交回给主线程

前端异步解决方案

传统方式: 回调函数和事件

  • 流行解决方案:
    • Promise es6
    • Generator es6
    • Async es7
    const fs = require('fs');
    const path = require('path');
    function readFile() {
        return new Promise((resolve, reject) => {
            fs.readFile(path.join(__dirname, ...arguments), (err, data) => {
                if (err) reject(err);
                resolve(data);
            });
        });
    }

    // async 就是 generator 的语法糖 加上 自执行器

    const asyncReadFile = async function() {
        const f1 = await readFile('1.txt');
        const f2 = await readFile('2.txt');
        console.log(f1.toString());
        console.log(f2.toString());
    }
    asyncReadFile().then(function() {
        console.log('done');
    });

Async 的原理:它本质上是Generator的语法糖 加上 执行器

六、npm脚本指的是使用npm命令来执行的脚本

使用npm命令来执行的脚本
认识package.json
$ npm init -y
初始化项目
package.json 用于纪录项目的相关信息 项目名 版本 作者 开源协议 依赖 脚本…

安装包
$ npm install packageName[@版本号] --save 项目依赖(部署环境依赖) -S
$ npm install packageName[@版本号] --save-dev 开发依赖(生产环境依赖) -D
$ npm install packageName[@版本号] -g 全局安装(一般情况全局安装的都是命令行工具)

删除包
$ npm uninstall packageName[@版本号] --save

除了纪录依赖信息以外 还纪录了版本

作用
项目移植 node_modules 依赖
运行 npm install 会自动根据 package.json 里的依赖自动安装

脚本
脚本写在 scripts 里的命令
运行脚本 通过命令运行
$ npm run 任务 可以运行任务
“main”: “index.js”,//主入口文件

多个脚本执行
$ npm run app & npm run dev 全部执行以后再输出结果
% npm run app && npm run dev 依次执行任务

events

事件其实是某种情况触发的功能
事件的发布
事件的订阅
发布+订阅 表示需要执行一个任务

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!