express
下載
npm install express
搭建服務(wù)
const express = require("express");
const app = express();
app.get("/home", (req, res) => {
res.send("home");
});
app.listen(3000, () => {
console.log("http://127.0.0.1:3000");
});
restful api
操作 | 請求類型 | url | 返回 |
---|---|---|---|
獲取所有 | GET | /users | |
獲取單個 | GET | /users/1 | |
新增 | POST | /users | |
修改部分 | PATCH | /users/1 | |
修改全部 | PUT | /users/1 | |
刪除 | DELETE | /users/1 |
路由
一個路由由 請求方法 路徑 和 回調(diào)函數(shù)組成
app.get("/users", (req, res) => {
res.send("get users");
});
app.post("/users", (req, res) => {
res.send("post users");
});
app.delete("/users", (req, res) => {
res.send("delete users");
});
app.put("/users", (req, res) => {
res.send("put users");
});
app.patch("/users", (req, res) => {
res.send("patch users");
});
匹配 404 路由
app.all("*", (req, res) => {
res.send("404 not found");
});
獲取請求報文參數(shù)
// /users?a=1&b=2
app.get("/users", (req, res) => {
// /users
console.log(req.path);
// { a: '1', b: '2' }
console.log(req.query);
// 獲取請求頭信息
console.log(req.get("User-Agent"));
});
獲取動態(tài)路由參數(shù)
app.get("/users/:id", (req, res) => {
console.log("id", req.params.id);
res.send("get users");
});
獲取 post 請求體參數(shù)
下載
npm i body-parser
// 引包
const bodyParser = require("body-parser");
// 配置
// 解析 querystring 格式請求體
app.use(bodyParser.urlencoded({ extecded: false }));
// 解析 json 格式請求體
app.use(bodyParser.json());
app.post("/users", (req, res) => {
console.log(req.body);
});
響應(yīng)
app.get("/users/:id", (req, res) => {
// 設(shè)置狀態(tài)碼
res.status(200);
// 設(shè)置響應(yīng)頭
res.set("abc", "abc");
// 返回字符串
res.send("get users");
// 返回 json 數(shù)據(jù)
res.json({
data: "123",
});
// 重定向
res.redirect("http://www.baidu.com");
// 下載響應(yīng)
res.download("./test.txt");
// 響應(yīng)文件內(nèi)容
res.sendFile("./test.html");
});
中間件 Middleware
中間件本質(zhì)是一個回調(diào)函數(shù),可以像路由回調(diào)一樣訪問請求對象request
響應(yīng)對象 response
中間件的作用是:使用函數(shù)封裝公共操作,簡化代碼
全局中間件
// 聲明中間件
function customMiddleware(req, res, next) {
console.log("全局中間件使用了");
// 必須調(diào)用
next();
}
// 使用
app.use(customMiddleware);
路由中間件
// 聲明中間件
function customMiddleware(req, res, next) {
console.log("路由中間件使用了");
next();
}
// 使用
app.get("/users", customMiddleware, (req, res) => {
res.send("get user");
});
// 多個中間件使用
app.get("/users", customMiddleware, customMiddleware2, (req, res) => {
res.send("get user");
});
靜態(tài)資源
app.use(express.static(path.join(__dirname, '../public')));
// public 文件夾路徑可省略不寫如下
http://127.0.0.1:3000/mn.png
防盜鏈 referer
function customMiddleware(req, res, next) {
const referer = req.get("referer");
next();
}
文件上傳 formidable
下載
npm install formidable@v2
使用
const formidable = require("formidable");
router.post("/upload", function (req, res, next) {
const form = formidable({
multiples: true,
// 設(shè)置上傳文件的保存目錄
uploadDir: path.join(__dirname, "../public/images"),
// 保存文件后綴
keepExtensions: true,
});
form.parse(req, (err, fields, files) => {
if (err) {
next(err);
return;
}
res.json({ fields, files });
});
});
koa
下載
npm install koa
使用
const Koa = require("koa");
const app = new Koa();
app.listen(3000, () => {
console.log(`http://127.0.0.1:3000`);
});
獲取 get 請求體參數(shù)
ctx.request.query
獲取動態(tài)路由參數(shù)
ctx.params?.id
@koa/router 路由
下載
npm install @koa/router
使用
const Router = require("@koa/router");
const router = new Router();
// 設(shè)置路由前綴
// const router = new Router({ prefix: "/users" });
router.get("/", (ctx) => {
ctx.body = {
code: 0,
};
});
app.use(router.routes());
koa-body
獲取 post 請求體參數(shù)
下載
npm install koa-body
使用
const { koaBody } = require("koa-body");
app.use(koaBody());
獲取 post 請求體參數(shù)
ctx.request.body
koa-static
配置靜態(tài)資源
下載
npm install koa-static
使用
const path = require("node:path");
const static = require("koa-static");
app.use(static(path.join(__dirname, "../public")));
// http://127.0.0.1:3000/images/test.jpg
npm install koa-views ejs
引入模板文件
下載
npm install koa-views ejs
使用
const views = require("koa-views");
// 此時文件后綴為 .ejs
// app.use(views(path.join(__dirname, "../views"), { extension: "ejs" }));
// 把文件后綴替換為 .html
app.use(views(path.join(__dirname, "../views"), { map: { html: "ejs" } }));
router.get("/", async (ctx) => {
let title = "你好ejs";
let list = ["哈哈", "嘻嘻", "看看", "問問"];
let content = "<h2>這是一個h2</h2>";
let num = 10;
await ctx.render("index", {
title,
list,
content,
num,
});
});
模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>普通模版</h1>
<h1>ejs循環(huán)輸出模版</h1>
<ul>
<%for(var i=0;i<list.length;i++){%>
<li>
<%= list[i] %>
</li>
<%}%>
</ul>
<h2>原文輸出標簽</h2>
<%- content %>
<h2>條件判斷</h2>
<% if(num> 20){ %>
大于20
<% }else{ %>
小于20
<% }
%>
</body>
</html>
formidable 文件上傳
下載
npm install formidable@v2
使用
const path = require("node:path");
const formidable = require("formidable");
router.post("/", async (ctx, next) => {
const form = formidable({
multiples: true,
// 設(shè)置上傳文件的保存目錄
uploadDir: path.join(__dirname, "../public/uploads"),
// 保存文件后綴
keepExtensions: true,
// 修改文件名 必須返回一個字符串即:新的存儲文件名稱
filename: (name, ext, part, form) => {
return `ttttt${ext}`;
},
});
await new Promise((resolve, reject) => {
form.parse(ctx.req, (err, fields, files) => {
if (err) return reject(err);
// files.file file就是前端上傳的字段名稱
ctx.body = { fields, files: files.file };
resolve();
});
});
return await next();
});
async-validator 數(shù)據(jù)校驗
下載
npm i async-validator
兩種模塊化使用方式
es6
import Schema from "async-validator";
const descriptor = {
age: {
type: "number",
required: true,
message: "年齡必填",
},
};
const validator = new Schema(descriptor);
const values = await validator.validate({ age });
commonjs
const Schema = require("async-validator");
const descriptor = {
age: {
type: "number",
required: true,
message: "年齡必填",
},
};
const validator = new Schema.default(descriptor);
const values = await validator.validate({ age });
其他常用校驗
const Schema = require("async-validator");
async create(ctx) {
try{
let { name, age, sex } = ctx.request.body;
// 參數(shù)檢驗
const descriptor = {
name: [
{
// 類型
type: "string",
// 必填
required: true,
// 長度(姓名三個字)
// len: 3,
// 范圍(姓名3-5個字)
min: 3,
max: 5,
// 提示信息
message: "姓名3-5個字",
},
{
// 自定義校驗函數(shù)
validator: (rule, value) => value.includes("xr"), message: "姓名必須包含xr" },
],
age: {
type: "number",
required: true,
// 正則
pattern: /^[0-9]+$/,
// 驗證前執(zhí)行的函數(shù):去除空格
transform(value) {
return value.trim();
},
message: "年齡必填",
},
sex: {
type: "enum",
enum: [1, 2],
required: true,
message: "性別錯誤",
},
};
const validator = new Schema.default(descriptor);
const values = await validator.validate({ name, age, sex });
}catch(error){
const msg = error?.errors[0]?.message;
}
}
錯誤處理 koa-json-error
下載
npm install --save koa-json-error
使用
const error = require("koa-json-error");
const app = new Koa();
app.use(error());
cross-env 設(shè)置環(huán)境變量
下載
npm install --save-dev cross-env
配置變量
package.json
// cross-env NODE_ENV=dev NODE_TEST=true
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "cross-env NODE_ENV=dev NODE_TEST=true nodemon ./src/main.js "
},
}
獲取值
// dev true string
console.log(process.env.NODE_ENV, process.env.NODE_TEST, typeof process.env.NODE_TEST);
dotenv
從 .env 為 nodejs 項目加載環(huán)境變量。
下載
npm install dotenv --save
配置使用
在項目的根目錄中創(chuàng)建一個 .env 文件
.env
NODE_PORT = 3000;
const path = require("path");
// 添加到 process.env 中,默認獲取 .env 文件
require("dotenv").config();
// 獲取 .env.dev 文件
require("dotenv").config({ path: path.resolve(process.cwd(), ".env.dev") });
// 3000
console.log(process.env.NODE_PORT);
jsonwebtoken
下載
npm install jsonwebtoken
生成 token
const jwt = require("jsonwebtoken");
const token = jwt.sign(payload, JWTSECRET, { expiresIn: 60 * 60 * 24 });
驗證 token
jwt.verify(token, JWTSECRET);
報錯 Expected “payload” to be a plain object.(翻譯結(jié)果為:“payload”應(yīng)為純對象。)
返回的不是純對象 == res._doc
const res = await UserModel.create(body);
const token = jwt.sign(res._doc, JWTSECRET, { expiresIn: 60 * 60 * 24 });
bcryptjs
下載
npm install bcryptjs
使用
/**
* 加密
* @param {*} val
* @returns
*/
const crpytPassword = (val) => {
const salt = bcrypt.genSaltSync(10);
const hash = bcrypt.hashSync(val, salt);
return hash;
};
/**
* 解密驗證
* @param {*} val 原始值
* @param {*} hash 加密后的值
* @returns
*/
const checkPassword = (val, hash) => {
return bcrypt.compareSync(val, hash);
};
pm2 負載均衡
下載
npm install pm2@latest -g
查看版本
pm2 - v;
啟動
pm2 start app.js
// --watch 監(jiān)聽
pm2 start app.js --watch
// --name 別名
pm2 start app.js --name test
重載(不關(guān)閉)和重啟(瞬間關(guān)閉開啟)
pm2 reload app.js
pm2 reload all
pm2 restart app.js
pm2 restart all
從 pm2 中關(guān)閉
pm2 stop id值
// 例
pm2 stop 0
pm2 stop all
從 pm2 中移除
pm2 delete 0
pm2 delete all
查看 pm2 所有項目列表
pm2 list
查看詳情
pm2 show name的值
// 例
pm2 show app
實時監(jiān)控查看資源
pm2 monit
查看日志
pm2 logs
pm2 logs app
mode
-
fork
只啟動一個進程單實例,用于多語言混編 python php -
cluster
多實例多進程,只適用 node 一種語言,不需要額外端口配置文章來源:http://www.zghlxwxcb.cn/news/detail-632842.html
生成配置文件文章來源地址http://www.zghlxwxcb.cn/news/detail-632842.html
pm2 init simple
// 運行
pm2 start .\ecosystem.config.js
到了這里,關(guān)于nodejs框架 express koa介紹以及從零搭建 koa 模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!