美文网首页
node - 学习笔记

node - 学习笔记

作者: 自走炮 | 来源:发表于2020-08-09 02:48 被阅读0次
    • 简单 web 服务器
    • 连接 mongodb
    • promise
    • nodemon 和 pm2
    • whistle

    简单 web 服务器

    // config.js 文件
    const config = {
      hostname: "127.0.0.1",
      port: "3000",
    };
    exports.config = config;
    
    // myserver.js 文件
    const config = require("./config").config; // 引用 config.js 文件
    const http = require("http"); // nodejs 内置 http 模块
    const fs = require("fs"); // nodejs 内置 fs 文件读写模块
    const qs = require("querystring"); // nodejs 内置 qs 查询串模块
    const ejs = require("ejs"); // ejs 模板实现表单页面,安装 npm install ejs
    
    var template = fs.readFileSync(__dirname + "/forum.ejs", "utf-8"); // 读 ejs 文件
    var posts = [];
    const hostname = "127.0.0.1"; // 如无 config.js 文件则统一配置
    const port = 3000;
    
    const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader("Content-Type", "text/plain");
    
      switch (
        req.url // req.url 返回客户端请求的 url
      ) {
        case "/":
          res.end("helo world.");
          break;
        case "/home":
          res.end("Welcome to my homepage!");
          break;
        default:
          res.end("NotFound!");
      }
    
      // 读 html 文件并返回
      fs.readFile(__dirname + "/index.html", "utf-8", function (err, data) {
        if (err) {
          res.setHeader("Content-Type", "text/plain");
          res.statusCode = 404;
          res.end("Not Founded.");
        } else {
          res.setHeader("Content-Type", "text/html");
          res.statusCode = 200;
          res.end(data);
        }
      });
    
      // 表单提交
      if (req.method === "POST") {
        req.data = "";
        // 表单数据收集
        req.on("readable", function () {
          var chr = req.read();
          if (chr) req.data += chr;
        });
        // 表单处理
        req.on("end", function () {
          var query = qs.parse(req.data);
          posts.push(query.content);
          showForm(posts, res); // 表单显示
        });
      } else showForm(posts, res);
    });
    
    function showForm(p_posts, res) {
      var data = ejs.render(template, { posts: p_posts }); // ejs 着色
      res.setHeader("Content-Type", "text/html");
      res.statusCode = 200;
      res.end(data);
    }
    
    // 打开监听
    server.listen(config.port, config.hostname, () => {
      console.log("Server running at http://${config.hostname}:${config.port}/");
    });
    
    <!-- forum.ejs 文件-->
    <form action="" method="post">
      <!-- action="" 向自身提交 -->
      <input type="text" name="content" id="content" />
      <input type="submit" value="提交" />
      <ul>
        <!-- <% for (var i = 0; i < posts.length; i++) { %>
            <li><%= posts[i] %></li>
            <% } %> -->
      </ul>
    </form>
    

    连接 mongodb

    // mongofunc.js 文件,安装 npm install mongodb [--save],自动生成 mongofunc.js 文件
    const MongoClient = require("mongodb").MongoClient; // mongodb 客户端
    const assert = require("assert"); // nodejs 内置 assert 断言模块
    
    const url = "mongodb://192.168.11.18:27017";
    const dbName = "komablog";
    
    MongoClient.connect(url, function (err, client) {
      assert.equal(null, err);
      console.log("Connected successfully to server");
      const db = client.db(dbName); // 打开数据库
    
      db.collection("posts", function (err, collection) {
        var list = [
          { title: "我爱玩马里奥", tag: "game" },
          { title: "我喜欢Nodejs编程", tag: "it" },
        ];
        // 插入 MongoDB 文档
        collection.insert(list, function (err, result) {
          assert.equal(null, err);
          client.close();
        });
        // 读 MongoDB 文档
        collection.find({ tag: "game" }).toArray(function (err, docs) {
          assert.equal(null, err);
          console.log(docs);
          client.close();
        });
      });
    });
    

    promise

    function dbupd(sql, done) {
      setTimeout(() => done(sql + " upd ok."), 800);
    }
    
    // 回调地狱
    dbupd("1.sql1", (result) => {
      console.log(result);
      dbupd("2.sql2", (result) => {
        console.log(result);
        dbupd("3.sql3", (result) => {
          console.log(result);
        });
      });
    });
    
    function dbupAsync(sql) {
      // Promise 异步方法
      // 成功调用 resolve(),失败调用 reject()
      const p = new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log(sql + " upd ok.");
          resolve(sql + ".ok");
        }, 800);
      });
      return p;
    }
    // Promise 类(p 常量).then() 可调用 Promise 异步方法
    dbupAsync("1.sql1")
      .then(() => dbupAsync("2.sql2"))
      .then(() => dbupAsync("3.sql3"));
    
    // async/await 可调用 Promise 异步方法
    async function upAllDB() {
      const result1 = await dbupAsync("1.sql1");
      const result2 = await dbupAsync("2.sql2");
      const result3 = await dbupAsync("3.sql3");
      console.log(result1, result2, result3);
    }
    upAllDB();
    

    nodemon 和 pm2

    $ sudo npm install nodemon -g # 热更新 node,nodemon server.js
    $ sudo npm install pm2 -g # 监控 node,生产环境服务器部署,pm2 start server.js
    
    $ pm2 list
    $ pm2 stop/restart/reload/delete 0 # 0 为进程号,可换进程名
    $ pm2 start server-pm2.json # server-pm2.json 文件为 pm2 配置,内容如下
    
    {
      "name": "myweb",
      "script": "server.js",
      "port": 8080,
      "env": { "NODE_ENV": "production" },
      "options": [""]
    }
    

    whistle

    $ sudo npm install whistle -g
    $ w2 help/start/restart/stop # 需下载 https 证书
    

    相关文章

      网友评论

          本文标题:node - 学习笔记

          本文链接:https://www.haomeiwen.com/subject/seegrktx.html