node - 学习笔记

2020-08-09  本文已影响0人  自走炮

简单 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 证书
上一篇下一篇

猜你喜欢

热点阅读