国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

nodejs框架 express koa介紹以及從零搭建 koa 模板

這篇具有很好參考價值的文章主要介紹了nodejs框架 express koa介紹以及從零搭建 koa 模板。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包