2022 年 ExpressJS 速查表
本文假设读者已具备 ExpressJS 的基础知识。如果您是 Express 新手,我建议您先观看以下视频播放列表:
创建新项目
假设您已经安装了NodeJS,只需打开您的IDE并进入一个空文件夹,然后在终端中执行以下操作:
-
创建一个新的 Node 项目
npm init -y -
安装依赖项
npm install express morgan dotenv -
如果你还没有全局安装 nodemon,请安装它。
npm install -g nodemon -
创建初始服务器文件、.gitignore 文件和 env 文件
touch server.js .env .gitignore -
将以下内容放入 .gitignore 文件中
.env
/node_modules
- 将以下内容放入 .env 文件中,该文件用于定义您不希望在代码中公开显示的变量(api 密钥、数据库凭据、敏感信息)或应根据上下文更改的变量。
PORT=5000
package.json
以下是一些我们可以在 package.json 中做的有用事情:
- 我们可以添加脚本,您可以添加任意数量的脚本,但我建议添加一些基本脚本。
"scripts: {
"start": "node server.js",
"dev": "nodemon server.js"
}
可以使用命令运行脚本,npm run <command name>例如,我们可以使用以下命令运行开发脚本npm run dev。
- 我们还可以选择使用 CommonJS 语法还是模块语法。如果不做任何设置,默认使用 CommonJS;但如果我们
"type":"module"在 package.json 文件中添加相应的配置,就可以使用模块语法。这会影响我们导入和导出文件的方式。
| 任务 | CommonJS | ES模块 |
|---|---|---|
| 导入依赖项/文件 | const something = require("something") |
import something from "something" |
| 从文件导出 | module.exports = something |
export default something |
您喜欢哪种方式完全取决于您的个人喜好,但请注意,在旧版本的 Node.js 中可能无法使用 ES Modules 导入 JSON 文件(或者在非常旧的版本中根本无法使用 ES Modules),而在新版本中可以使用实验性标志来实现此功能。
基本服务器设置
CommonJS 版本
// bring in environment variables from a .env file
require("dotenv").config()
// import express and morgan
const express = require("express")
const morgan = require("morgan")
// create an application object
const app = express()
// define a PORT variable from the environment with a default value
const PORT = process.env.PORT || 4000
/////////////////////////////////////
// ALL YOUR MIDDLEWARE AND ROUTES GO HERE
app.use(morgan("tiny")) // middleware for logging
app.use(express.urlencoded({extended: true})) //middleware for parsing urlencoded data
app.use(express.json()) // middleware for parsing incoming json
app.use("/static", express.static("static")) // to set a folder for static file serving
/////////////////////////////////////
// Server Listener
app.listen(PORT, () => console.log(`Listening on port ${PORT}`))
ES模块版本
// Bring in environmental variables
import dotenv from "dotenv"
dotenv.config()
// import express and morgan
import express from "express"
import morgan from "morgan"
// create an application object
const app = express()
// define a PORT variable from the environment with a default value
const PORT = process.env.PORT || 4000
/////////////////////////////////////
// ALL YOUR MIDDLEWARE AND ROUTES GO HERE
app.use(morgan("tiny")) // middleware for logging
app.use(express.urlencoded({extended: true})) //middleware for parsing urlencoded data
app.use(express.json()) // middleware for parsing incoming json
app.use("/static", express.static("static")) // to set a folder for static file serving
/////////////////////////////////////
// Server Listener
app.listen(PORT, () => console.log(`Listening on port ${PORT}`))
中间件
中间件只是接收三个参数的函数:
req请求对象,稍后会详细介绍。res响应对象,稍后会详细介绍。next将 req/res 对象传递给下一个中间件或路由的函数。
以下是一个最简单的中间件示例
const middlewareFunction = (req, res, next) => {
console.log("This is middleware")
}
中间件功能可以通过.use应用程序对象或路由器的方法进行注册。
// using the middleware on all requests
app.use(middlewareFunction)
// using the middleware on certain urls
app.use("/endpoint", middlewareFunction)
前面代码片段中未提及的其他常用中间件包括:
- CORS用于设置 API 的 CORS 设置
- 方法重写:重写表单提交时的请求方法。
- express-session用于设置会话 cookie
还有很多其他的……
路线
路由决定了服务器对传入请求的响应方式。路由可以通过在应用程序对象或路由器上使用以下方法之一来创建:
.all对于任何方法的请求.get对于 GET 请求.post对于 POST 请求.put对于 PUT 请求.delete删除请求
所有这些函数都接受两个参数:
- 终点
req一个接受res参数的“操作”、“控制器”或“路由处理程序”函数
以下是一个例子:
// writing pass an anonymous function
app.get("/endpoint", (req, res) => {
res.send("The Response")
})
// using a named function
function routeHandler(req, res){
res.send("the response")
}
app.get("/endpoint", routeHandler)
请求对象(res)
请求对象表示来自传入请求的数据,并传递给所有中间件和路由处理程序。
-req.headers包含传入请求头的对象
-req.params包含所有路由参数的对象
-req.query包含 URL 查询字符串中所有键/值对的对象
-req.body包含请求体键/值对的对象(由 express.urlencoded 或 express.json 中间件解析)
-req.method请求方法字符串
以及更多
响应对象(res)
响应对象是一个用于帮助编写请求响应的对象。它主要由用于处理不同类型响应的辅助函数组成。
-res.send根据传入的参数发送文本、HTML 或 JSON 请求
-res.json以 JSON 响应的形式发送 JavaScript 对象或数组
-res.render根据模板渲染 HTML 响应
渲染模板
模板允许您动态生成 html 响应,有几种模板引擎可供使用,以下是一些关于如何使用它们的文章。
要渲染模板,我们使用一个res.render接受两个参数的函数:
- 要在视图文件夹中找到的文件的名称
- 包含可用于模板渲染的数据的 JavaScript 对象(每种模板语言都应该有自己在模板中使用该对象数据的方式)。
路由器对象
您可以使用路由器将路由分组在一起,路由器可用于组织路由,并可将中间件应用于特定路由组。
创建路由器
// create the router object
const router = express.Router()
// register it with the application for routes with a certain prefix
app.use("/prefex", router)
就像应用程序对象一样,你可以向路由器注册中间件路由。
// router specific middleware
router.use(middlewareFunction)
// registering routes
router.get("/endpoint", routerHandler) // url is /prefix/endpoint
连接数据库
以下库可以帮助您连接到不同的数据库。
- 用于连接 Mongoose 数据库的Mongoose博客
- sequalize ORM 用于 SQL 数据库(postgres、mysql 等)
- objection ORM 用于 SQL 数据库(postgres、mysql 等)
- waterline ORM for SQL databases (postgres, mysql 等)
进行 API 调用
请记住,Node.js 中无法直接使用 fetch,而 jQuery 只是一个前端库。不过,您还有一些其他选择。
- node-fetch是一个复刻浏览器 fetch 函数的库
- Axios 是一个用于进行 API 调用的库
- 我有一个用于发起 API 调用的库
- 需要另一个 HTTP 客户端库