[11] 建立进入页面和流程控制

这边你需要自己制作一个流程控制

不了解的话建可以画个图来确认现在在哪个流程

基本上都会回到主要操控介面

所以这边会先建立 start 流程并呼叫对应进入页面

index.js 呼叫流程控制

const http = require("http");
const { receiveTelegram } = require("./botHook/main");
const flowController = require("./controller/flowController");

var server = http.createServer(async function (req, res) {
  let url = req.url.split("?")[0];
  let paramrter = req.url.split("?")[1];
  if (paramrter) paramrter = getUrlParameter(paramrter);
  let data = null;
  let buffers = [];
  for await (const chunk of req) {
    buffers.push(chunk);
  }
  data = Buffer.concat(buffers).toString();
  data = data ? JSON.parse(data) : null;
  // 上方获取资料区

  // 这边开始实作 url
  if (url === "/") {
    res.writeHead(200, { "Content-Type": "application/json" });
    // 实作判断请求
    if (req.method === "POST") {
      if (data) {
        receiveTelegram(data, res);
      }
      res.end();
    } else {
      res.write("404 page");
      res.end();
    }
  } else {
    res.write("404 page");
    res.end();
  }
});

server.listen(3000);

flowController.start();

/**
 * @description 用来确认是否有带参数
 *
 * @param {string} reqUrl url ? 後面的部分
 * @return {*}
 */
function getUrlParameter(reqUrl) {
  var url = reqUrl; //获取url中"?"符後的字串
  var theRequest = new Object();
  var strs = null;
  strs = url.split("&");
  for (var i = 0; i < strs.length; i++) {
    theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
  }
  return theRequest;
}

新增控制流程的 controller\flowController.js

controller\flowController.js

const viewPrinter = require("../view/viewPrinter");

class FlowController {
  
  constructor() {}
  
  /**
   * @description 确保都拿到同一个实例
   *
   * @static
   * @return {*} 
   * @memberof ConsoleItem
   */
  static getInstance() {
    if (!this.instance) {
      this.instance = new this();
    }
    return this.instance;
  }

  /**
   * @description 起始画面
   *
   * @memberof FlowController
   */
  async start() {
    await viewPrinter.welcome();
    console.log("nextTick");
  }

}

let flowController = FlowController.getInstance();

module.exports = flowController;

接着制作 view\viewPrinter.js 来印画面

view\viewPrinter.js

const consoleItem = require("../interface/consoleItem");

class ViewPrinter {
  
  constructor() {}
  
  /**
   * @description 确保都拿到同一个实例
   *
   * @static
   * @return {*} 
   * @memberof ConsoleItem
   */
  static getInstance() {
    if (!this.instance) {
      this.instance = new this();
    }
    return this.instance;
  }


  /**
   * @description 欢迎你
   *
   * @memberof ViewPrinter
   */
  async welcome() {
    return new Promise((resolve) => {
      let str = [
        "=======================================================",
        "=======================================================",
        "============                               ============",
        "============     Welcome Node Telegram     ============",
        "============                               ============",
        "=======================================================",
        "=======================================================",
      ]
      console.log("\x1b[36m");
      for( let i = 0 ; i < str.length ; i++ ) {
        setTimeout(() => {
          console.log(str[i]);
          if(i === str.length -1) {
            console.log("\x1b[0m");
            resolve();
          };
        }, i * 100);
      } 
    })  
  }

}

let viewPrinter = ViewPrinter.getInstance();

module.exports = viewPrinter;

当然一样不能一口气印出来

所以弄成 Promise 确保结束後再执行下一段 nextTick

这里是非同步与同步的概念 async await 等等

day11


<<:  Day25 能不能给我一首歌的时间 这首歌我希望是十年

>>:  D11 - 彭彭的课程#Python 流程控制:回圈进阶控制,break、continue、else 命令

中场回顾

过去一周我们提到了物件导向程序设计的重要概念,像是类别、抽象类别、介面,以及四大特徵:抽象、封装、继...

[Day 26] 快照测试(Snapshot Testing)是什麽?什麽时间适合使用?

快照测试第一时间听起来好像是会「帮我们的画面做一个快照,纪录下来当时的画面」,但这样的说法对也不对...

Ruby幼幼班--Single Number

Single Number 黑魔法集合.... 题目连结:https://leetcode.com...

【DAY 2 】Microsoft 365 Developer Program - Microsoft 365 开发人员计画

昨天说到Microsoft 365 开发人员计画 (Microsoft 365 Developer ...

JavaScript阵列

阵列(Array)是JavaScript提供的内建物件,主要功能是提供一连串具有连续性的储存空间。值...