整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Node.js发送邮件

、进入QQ邮箱。

  • 设置-> 账户-> POP3/SMTP服务。开启服务
  • 点击生成授权码(需要发短信到腾讯验证),注意生成的授权码需要保存下来。


2、相关代码

let nodemailer = require('nodemailer');
let transporter = nodemailer.createTransport({
  'host': 'smtp.qq.com',    // 主机
  'secureConnection': true,    // 使用 SSL
  'service': 'qq',
  'port': 465,    // SMTP 端口
  'auth': {
    'user': '您的QQ账号@qq.com',    // 账号
    'pass': '上一步生成的授权码' // 授权码
  }
});

let mailContent = {
  from: '"NBA 官网" <您的QQ账号@qq.com>', // 发件人地址
  to: 'liutao0723@163.com', // 收件人地址
  subject: 'Hello, world!', // 主题
  // 发送text或者html格式
  // text: 'Hello 我是火星黑洞', // plain text body
  html: '<b>Hello 我是火星黑洞。。。。。</b>' // html body
};

// 发送邮件
transporter.sendMail(mailContent, (err, info) => {
  if (err) {
    console.log('出错了', err)
  } else {
    console.log('发送成功,请前往发送者的邮箱查看已发送邮收件者的已接收邮箱查看') 
  }
});

3、相关截图

  • 发件人

  • 收件人

件上传如果加上进度条会有更好的用户体验(尤其是中大型文件),本文使用Nodejs配合前端完成这个功能。

前端我们使用 FormData 来作为载体发送数据。

效果

前端部分

HTML 部分 和 Js 部分

<input type="file" id="file" />
<!-- 进度条 -->
<progress id="progress" value="0" max="100"></progress>
// 获取 input file 的 dom 对象
const inputFile = document.querySelector('#file');

// 监听 change 事件
inputFile.addEventListener('change', function() {
    // 使用 formData 装载 file
    const formData = new FormData();
    formData.append('file', this.files[0]);
    
    // 上传文件
    upload(formData);
})

下面我们实现upload 方法。

使用 XMLHttpRequest 的方式

const upload = ( formData ) => {
    const xhr = new XMLHttpRequest();
    // 监听文件上传进度
    xhr.upload.addEventListener('progress', function(e) {
      if (e.lengthComputable) {
        // 获取进度
        const progress = Math.round((e.loaded * 100) / e.total);
        
        document.querySelector('#progress').setAttribute('value', progress);
      }
    },false);
    
    // 监听上传完成事件
    xhr.addEventListener('load', ()=>{
        console.log('上传完成')
    }, false);
    
    xhr.open('post', 'http://127.0.0.1:3000/upload');
    xhr.send(formData);   
}

使用 jQuery 的 ajax 上传

jQuery 目前的使用量依然庞大,那么使用 jQuery 的 ajax 如何监听文件上传进度呢:

const upload = ( formData ) => {
    $.ajax({
        type: 'post',
        url: 'http://127.0.0.1:3000/upload',
        data: formData,
        // 不进行数据处理和内容处理
        processData: false,
        contentType: false,
        // 监听 xhr
        xhr: function() {
          const xhr = $.ajaxSettings.xhr();
          if (xhr.upload) {
            xhr.upload.addEventListener('progress', e => {
                const { loaded, total } = e;
                var progress = (loaded / total) * 100;
                document.querySelector('#progress').setAttribute('value', progress);
              },
              false
            );
            return xhr;
          }
        },
        success: function(response) {
          console.log('上传成功');
        }
      });
}

使用 axios 上传并监听进度

axios 使用量非常大,用它监听文件上传更简单,代码如下:

const upload = async ( formData ) => {

    let config = {
        // 注意要把 contentType 设置为 multipart/form-data
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        
        // 监听 onUploadProgress 事件
        onUploadProgress: e => {
            const {loaded, total} = e;
            // 使用本地 progress 事件
            if (e.lengthComputable) {
                let progress = loaded / total * 100;
                document.querySelector('#progress').setAttribute('value', progress);
            }
        }
      };

      const { status } = await axios.post('http://127.0.0.1:3000/upload', formData, config);
      if (res.status === 200) {
          console.log('上传完成');
      }
}

Nodejs 部分

这部分比较简单,其实就是单纯的文件上传,我们用 Koa 来实现.

环境搭建及依赖包安装

这里使用 koa2,安装以下依赖包:

  • koa
  • @koa/router: koa 的路由
  • @koa/cors:用于跨域
  • koa-body: 解析 body 数据
  • nodemon: 使用它启动服务,带有热更新

代码部分

const Koa = require('koa');
const Router = require('@koa/router');
const koaBody = require('koa-body');
const path = require('path');
const fs = require('fs');
const cors = require('@koa/cors');

const app = new Koa();
const router = new Router();

router.all('/upload', async ctx => {
  // 处理文件上传    
  const res = await dealFile(ctx);

  res && (ctx.body = {
      status: 200,
      msg: 'complete'
    });
});

// 中间件部分
app.use(cors());
app.use(
  koaBody({
    multipart: true,
    formidable: {
      maxFileSize: 2000 * 1024 * 1024 //最大2G
    }
  })
);
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

dealFile 方法处理上传的文件

出于性能考虑,操作file 毫无疑问要使用stream。 我们要监听文件流end事件,由于无法在事件回调里返回响应,因为会报 404,所以需要使用 Promise 来封装一下,然后用 async、await

const dealFile = ctx => {
  const { file } = ctx.request.files;

  const reader = fs.createReadStream(file.path);
  const writer = fs.createWriteStream(
    // 文件上传到 image 文件夹中
    path.resolve(__dirname, './image', file.name)
  );

  return new Promise((resove, reject) => {
  
    reader.pipe(writer);
    
    reader.on('end', () => {
      resove(true);
    });
    
    reader.on('error', err => {
      throw err;
    })
    
  });
};

到这里就全部完成了。

这里注意一下:前端监听文件进度不需要后端有什么特殊处理,后端仅仅是做了文件流的写入而已。


作者:Ve
链接:https://juejin.im/post/5e7ca27df265da42ac0294e5
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

者:林克 来源:JavaScript

1. JavaScript

如果你是一名希望掌握一些后端技能的前端开发人员,那么在开始构建 Node.js 应用程序之前,将不必花费大量时间学习 JavaScript。但是,如果你是一个初学者,希望在尽可能短的时间内掌握 Node.js,那么在深入研究 Node.js 环境之前,必须学习以下概念。

  • 箭头函数
  • 数据类型
  • 表达式
  • 函数
  • 词法
  • this
  • 循环和作用域
  • 数组
  • 模版字符串
  • 严格模式
  • ES6/ES7

在Node.js中,将面对大量的异步编程,为此,建议学习以下概念。

  • 计时器
  • Promises
  • 闭包
  • 事件循环
  • 异步函数
  • 回调函数

2. NPM

Node Package Manager 拥有大量的软件包,在我们开发需要大量依赖关系的应用程序时,使用 NPM 包管理程序将非常方便。

3. Node.js 基础

  • Event Emitters
  • Callbacks
  • Buffers
  • Module System

4. 版本控制系统

Git,GitHub

5. HTTP / HTTPS协议

了解有关如何使用传输协议传输数据的基础知识将使您成为更好的Node.js开发人员,对HTTP和HTTPS的工作原理有很好的了解。HTTPS使用称为传输层安全性(TLS)的加密协议来加密通信。在后端环境中有很多东西要学习,如果您不了解网络的工作原理,可能会有些困惑,有以下几种请常见的求方法用于网络上的基本通信:

  • GET:用于检索资源的表示形式
  • POST:用于创建新资源
  • PUT:用于更新功能
  • PATCH:用于修改功能
  • DELETE:用于删除URL标识的资源
  • OPTIONS:请求给定URL或服务器的允许的通信选项

6. WEB 框架

以下框架不需要全部精通,择一学习即可。

  • Express.js
  • Meteor.js
  • Sails.js
  • Koa.js
  • Nest.js

7. 数据库管理

关系型数据库

  • SQL Server
  • MySQL
  • PostgreSQL
  • MariaDB

NoSQL数据库

  • MongoDB
  • Redis

8. 全文检索

ElasticSearch

一个基于Apache Lucene并使用Java开发的搜索和分析引擎。使用ElasticSearch,您可以实时存储和分析大量数据。当它搜索索引而不是搜索文本时,ElasticSearch也实现了出色的搜索性能。它的核心是使用基于结构的文档,而不是广泛的REST API附带的用于存储和搜索数据的表和模式。您可以将ElasticSearch视为处理JSON请求并向您返回JSON数据的服务器。

Solr

它提供了相当高级的实时搜索功能,例如字段搜索,布尔查询,阶段查询,模糊查询,拼写检查,自动完成等等。

9. 缓存

Memory Cache

这种技术通常也称为缓存,因为在大多数情况下,缓存与服务器中的内存相关联。在这种技术中,服务器内存的一部分用作缓存,我们在其中存储减少应用程序中的网络调用所需的所有数据。在Node.js中,我们拥有node-cache 和 memory-cache作为一些出色的库来处理nodejs服务器中的内存缓存。

Distributed Cache

在这种缓存技术中,我们将多个网络的内存合并到一个内存数据存储中,之后将其用作最终数据缓存以证明对数据的快速访问。此技术尤其适用于大量数据,并且通过向群集添加更多服务器内存,大量的网络调用同时允许增量扩展和扩展。关于分布式缓存,Redis是最著名的事情之一。

10. 模板引擎

使用模板引擎,我们可以在应用程序中使用静态模板文件,而在运行时,该模板引擎将模板文件中的变量替换为实际值,然后将模板转换为发送给客户端的HTML文件。下面列出了一些流行的模板引擎。

  • Mustache.js
  • Handlebars
  • EJS

11. 实时通讯

如果您只是作为后端开发人员起步,那么在了解Socket.IO中的实时通信方面有很多事情,实时通信背后的主要逻辑就在于客户端和服务器之间。它允许流动双向客户端与服务器之间的数据,你能想到的双向数据流的数据的两个终端之间的同步流程,实现实时通讯的行为,这类行为被启用时,客户端在浏览器中具有Socket.IO以及与Socket.IO软件包集成的服务器。并且数据可以以JSON请求的形式发送。

12. API Clients

  • REST
  • GraphQL

13. 测试

单元测试框架

在单元测试中,我们隔离地测试各个单元/组件,其中单元可以是应用程序中代码中可测试的最小部分。在Node.js中,下面列出了几种常见的单元测试框架:

  • Jest
  • Mocha
  • Chai