Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 中文字幕免费在线看,国产午夜亚洲精品国产,91精品视频网站

          整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Node.js發(fā)送郵件

          、進入QQ郵箱。

          • 設置-> 賬戶-> POP3/SMTP服務。開啟服務
          • 點擊生成授權碼(需要發(fā)短信到騰訊驗證),注意生成的授權碼需要保存下來。


          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 官網(wǎng)" <您的QQ賬號@qq.com>', // 發(fā)件人地址
            to: 'liutao0723@163.com', // 收件人地址
            subject: 'Hello, world!', // 主題
            // 發(fā)送text或者html格式
            // text: 'Hello 我是火星黑洞', // plain text body
            html: '<b>Hello 我是火星黑洞。。。。。</b>' // html body
          };
          
          // 發(fā)送郵件
          transporter.sendMail(mailContent, (err, info) => {
            if (err) {
              console.log('出錯了', err)
            } else {
              console.log('發(fā)送成功,請前往發(fā)送者的郵箱查看已發(fā)送郵收件者的已接收郵箱查看') 
            }
          });

          3、相關截圖

          • 發(fā)件人

          • 收件人

          件上傳如果加上進度條會有更好的用戶體驗(尤其是中大型文件),本文使用Nodejs配合前端完成這個功能。

          前端我們使用 FormData 來作為載體發(fā)送數(shù)據(jù)。

          效果

          前端部分

          HTML 部分 和 Js 部分

          <input type="file" id="file" />
          <!-- 進度條 -->
          <progress id="progress" value="0" max="100"></progress>
          // 獲取 input file 的 dom 對象
          const inputFile = document.querySelector('#file');
          
          // 監(jiān)聽 change 事件
          inputFile.addEventListener('change', function() {
              // 使用 formData 裝載 file
              const formData = new FormData();
              formData.append('file', this.files[0]);
              
              // 上傳文件
              upload(formData);
          })

          下面我們實現(xiàn)upload 方法。

          使用 XMLHttpRequest 的方式

          const upload = ( formData ) => {
              const xhr = new XMLHttpRequest();
              // 監(jiān)聽文件上傳進度
              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);
              
              // 監(jiān)聽上傳完成事件
              xhr.addEventListener('load', ()=>{
                  console.log('上傳完成')
              }, false);
              
              xhr.open('post', 'http://127.0.0.1:3000/upload');
              xhr.send(formData);   
          }

          使用 jQuery 的 ajax 上傳

          jQuery 目前的使用量依然龐大,那么使用 jQuery 的 ajax 如何監(jiān)聽文件上傳進度呢:

          const upload = ( formData ) => {
              $.ajax({
                  type: 'post',
                  url: 'http://127.0.0.1:3000/upload',
                  data: formData,
                  // 不進行數(shù)據(jù)處理和內容處理
                  processData: false,
                  contentType: false,
                  // 監(jiān)聽 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 上傳并監(jiān)聽進度

          axios 使用量非常大,用它監(jiān)聽文件上傳更簡單,代碼如下:

          const upload = async ( formData ) => {
          
              let config = {
                  // 注意要把 contentType 設置為 multipart/form-data
                  headers: {
                    'Content-Type': 'multipart/form-data'
                  },
                  
                  // 監(jiān)聽 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 來實現(xiàn).

          環(huán)境搭建及依賴包安裝

          這里使用 koa2,安裝以下依賴包:

          • koa
          • @koa/router: koa 的路由
          • @koa/cors:用于跨域
          • koa-body: 解析 body 數(shù)據(jù)
          • 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。 我們要監(jiān)聽文件流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;
              })
              
            });
          };

          到這里就全部完成了。

          這里注意一下:前端監(jiān)聽文件進度不需要后端有什么特殊處理,后端僅僅是做了文件流的寫入而已。


          作者:Ve
          鏈接:https://juejin.im/post/5e7ca27df265da42ac0294e5
          來源:掘金
          著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。

          者:林克 來源:JavaScript

          1. JavaScript

          如果你是一名希望掌握一些后端技能的前端開發(fā)人員,那么在開始構建 Node.js 應用程序之前,將不必花費大量時間學習 JavaScript。但是,如果你是一個初學者,希望在盡可能短的時間內掌握 Node.js,那么在深入研究 Node.js 環(huán)境之前,必須學習以下概念。

          • 箭頭函數(shù)
          • 數(shù)據(jù)類型
          • 表達式
          • 函數(shù)
          • 詞法
          • this
          • 循環(huán)和作用域
          • 數(shù)組
          • 模版字符串
          • 嚴格模式
          • ES6/ES7

          在Node.js中,將面對大量的異步編程,為此,建議學習以下概念。

          • 計時器
          • Promises
          • 閉包
          • 事件循環(huán)
          • 異步函數(shù)
          • 回調函數(shù)

          2. NPM

          Node Package Manager 擁有大量的軟件包,在我們開發(fā)需要大量依賴關系的應用程序時,使用 NPM 包管理程序將非常方便。

          3. Node.js 基礎

          • Event Emitters
          • Callbacks
          • Buffers
          • Module System

          4. 版本控制系統(tǒng)

          Git,GitHub

          5. HTTP / HTTPS協(xié)議

          了解有關如何使用傳輸協(xié)議傳輸數(shù)據(jù)的基礎知識將使您成為更好的Node.js開發(fā)人員,對HTTP和HTTPS的工作原理有很好的了解。HTTPS使用稱為傳輸層安全性(TLS)的加密協(xié)議來加密通信。在后端環(huán)境中有很多東西要學習,如果您不了解網(wǎng)絡的工作原理,可能會有些困惑,有以下幾種請常見的求方法用于網(wǎng)絡上的基本通信:

          • GET:用于檢索資源的表示形式
          • POST:用于創(chuàng)建新資源
          • PUT:用于更新功能
          • PATCH:用于修改功能
          • DELETE:用于刪除URL標識的資源
          • OPTIONS:請求給定URL或服務器的允許的通信選項

          6. WEB 框架

          以下框架不需要全部精通,擇一學習即可。

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

          7. 數(shù)據(jù)庫管理

          關系型數(shù)據(jù)庫

          • SQL Server
          • MySQL
          • PostgreSQL
          • MariaDB

          NoSQL數(shù)據(jù)庫

          • MongoDB
          • Redis

          8. 全文檢索

          ElasticSearch

          一個基于Apache Lucene并使用Java開發(fā)的搜索和分析引擎。使用ElasticSearch,您可以實時存儲和分析大量數(shù)據(jù)。當它搜索索引而不是搜索文本時,ElasticSearch也實現(xiàn)了出色的搜索性能。它的核心是使用基于結構的文檔,而不是廣泛的REST API附帶的用于存儲和搜索數(shù)據(jù)的表和模式。您可以將ElasticSearch視為處理JSON請求并向您返回JSON數(shù)據(jù)的服務器。

          Solr

          它提供了相當高級的實時搜索功能,例如字段搜索,布爾查詢,階段查詢,模糊查詢,拼寫檢查,自動完成等等。

          9. 緩存

          Memory Cache

          這種技術通常也稱為緩存,因為在大多數(shù)情況下,緩存與服務器中的內存相關聯(lián)。在這種技術中,服務器內存的一部分用作緩存,我們在其中存儲減少應用程序中的網(wǎng)絡調用所需的所有數(shù)據(jù)。在Node.js中,我們擁有node-cache 和 memory-cache作為一些出色的庫來處理nodejs服務器中的內存緩存。

          Distributed Cache

          在這種緩存技術中,我們將多個網(wǎng)絡的內存合并到一個內存數(shù)據(jù)存儲中,之后將其用作最終數(shù)據(jù)緩存以證明對數(shù)據(jù)的快速訪問。此技術尤其適用于大量數(shù)據(jù),并且通過向群集添加更多服務器內存,大量的網(wǎng)絡調用同時允許增量擴展和擴展。關于分布式緩存,Redis是最著名的事情之一。

          10. 模板引擎

          使用模板引擎,我們可以在應用程序中使用靜態(tài)模板文件,而在運行時,該模板引擎將模板文件中的變量替換為實際值,然后將模板轉換為發(fā)送給客戶端的HTML文件。下面列出了一些流行的模板引擎。

          • Mustache.js
          • Handlebars
          • EJS

          11. 實時通訊

          如果您只是作為后端開發(fā)人員起步,那么在了解Socket.IO中的實時通信方面有很多事情,實時通信背后的主要邏輯就在于客戶端和服務器之間。它允許流動雙向客戶端與服務器之間的數(shù)據(jù),你能想到的雙向數(shù)據(jù)流的數(shù)據(jù)的兩個終端之間的同步流程,實現(xiàn)實時通訊的行為,這類行為被啟用時,客戶端在瀏覽器中具有Socket.IO以及與Socket.IO軟件包集成的服務器。并且數(shù)據(jù)可以以JSON請求的形式發(fā)送。

          12. API Clients

          • REST
          • GraphQL

          13. 測試

          單元測試框架

          在單元測試中,我們隔離地測試各個單元/組件,其中單元可以是應用程序中代碼中可測試的最小部分。在Node.js中,下面列出了幾種常見的單元測試框架:

          • Jest
          • Mocha
          • Chai

          主站蜘蛛池模板: 亚洲色大成网站www永久一区 | 久久中文字幕一区二区| 成人一区二区免费视频| 亚洲综合无码一区二区三区| 无码国产精品一区二区高潮| 久久精品岛国av一区二区无码| 中文字幕精品一区二区日本| 欧洲精品码一区二区三区免费看 | 亚洲av无码天堂一区二区三区| 亚欧色一区W666天堂| 国模无码人体一区二区| 精品一区二区三区在线视频观看 | 国产精品合集一区二区三区| 国产日韩一区二区三区在线观看| 麻豆va一区二区三区久久浪 | 国产精品合集一区二区三区 | 成人区精品一区二区不卡| 一区二区三区视频在线播放| 欧美亚洲精品一区二区| 亚洲一区二区三区精品视频 | 无码免费一区二区三区免费播放| 精品国产一区二区三区AV性色| 中文字幕一区二区在线播放| 亚洲国产一区二区视频网站| 国产美女露脸口爆吞精一区二区| 精品视频一区在线观看| 国产精品第一区第27页| 久久久久久综合一区中文字幕 | 中文字幕一区二区三匹| 在线免费观看一区二区三区| 亲子乱av一区区三区40岁| 亚洲日本一区二区一本一道 | 国产乱子伦一区二区三区| 国产成人精品一区二区三区| 在线观看亚洲一区二区| 国产综合视频在线观看一区| 亚洲综合无码精品一区二区三区 | 成人精品一区二区户外勾搭野战| 精品国产免费观看一区| 无码人妻精品一区二区三区在线| 久久精品免费一区二区喷潮|