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 国产精品视频免费一区二区三区,中文字幕在线观看免费,国产乱老熟视频胖女人

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          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

          主站蜘蛛池模板: 国产伦精品一区二区三区四区| 在线观看视频一区二区| 高清无码一区二区在线观看吞精| 本免费AV无码专区一区| 亚洲AV成人精品日韩一区| 国产成人久久精品一区二区三区 | 亚洲色精品VR一区区三区| 激情无码亚洲一区二区三区| 91国偷自产一区二区三区| 影院成人区精品一区二区婷婷丽春院影视| 国产在线一区二区三区| 一区二区三区日本电影| 无码人妻aⅴ一区二区三区有奶水| 一区二区三区国产精品| 日本在线一区二区| 秋霞午夜一区二区| 亚洲一区AV无码少妇电影☆| 亚洲日本一区二区一本一道| 国产一区在线播放| 波多野结衣中文字幕一区二区三区 | 国产精品视频分类一区| 人妻无码一区二区三区免费| 射精专区一区二区朝鲜| 精品性影院一区二区三区内射| 亚洲国产一区国产亚洲| 麻豆一区二区三区精品视频| 精品国产福利一区二区| 在线成人一区二区| 无码一区二区三区中文字幕| 伊人久久大香线蕉AV一区二区| 毛片一区二区三区| 亚洲综合无码一区二区三区| 麻豆一区二区三区精品视频| 中文字幕无码不卡一区二区三区 | 视频一区精品自拍| 无码人妻精品一区二区三区久久| 亚洲一区二区三区高清| 日韩一区二区在线播放| 日韩一区二区三区在线| 国产成人精品无人区一区| 精品国产一区二区三区免费 |