一 发邮件
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
事件其实是某种情况触发的功能
事件的发布
事件的订阅
发布+订阅 表示需要执行一个任务
来源:CSDN
作者:Zxm?
链接:https://blog.csdn.net/zxm13253759789/article/details/103455090