中间件设置静态资源目录

文章讲述了为何要设置静态资源目录,以及如何在Express.js中通过`express.static`中间件让浏览器自动从public目录加载静态资源。作者还提供了代码示例,展示了如何配置静态资源和基本的路由处理。
摘要由CSDN通过智能技术生成

为什么要设置静态资源目录

服务器中的代码,对于外部来说都是不可见的,
所以我们写的html页面,浏览器无法直接访问
如果希望浏览器可以访问,则需要将页面所在的目录设置静态资源目录
设置static中间件后,浏览器访问时,会自动去public目录寻找是否有匹配的静态资源(可以理解为浏览器自动把public目录拼接到服务器地址的后面,我们想要静态资源的时候,不用自己加目录(public),直接服务器网址后面加上资源名字就可以了
在这里插入图片描述
如上图,地址栏中是http://localhost:3000/沈星回.png
而不是http://localhost:3000/public/沈星回.png(意思是public目录不用写)

设置静态资源代码示例

const express = require("express")
const path = require("path")

// 创建服务器的实例
const app = express()


// 设置static中间件后,浏览器访问时,会自动去public目录寻找是否有匹配的静态资源,默认寻找的是index.html文件
app.use(express.static(path.resolve(__dirname, "./public")))

// 配置路由
app.get("/loginaa", (req, res) => {
// 获取到用户输入的用户名和密码
// req.query 表示查询字符串中的请求参数
// console.log(req.query.username)
// console.log(req.query.password)
    if (req.query.username == "沈星回" && req.query.password == "5201314") {
        res.send("我知道了,沈星回是你老公!!!")
    }
    else {
        res.send("回答错误,你不是沈夫人")
    }

})


// 启动服务器
app.listen(3000, () => {
    console.log("服务器已起动~")
})

在上面的示例中,express.static 是Express.js提供的内置中间件,用于提供静态文件服务。它接受一个参数,即静态资源目录的路径,这里使用的是相对路径 ‘public’,表示静态资源文件存放在项目根目录下的 public 文件夹中。

接着,通过调用 app.use 方法将静态文件中间件应用到整个应用程序中。这样,当浏览器发出针对 / 路径下的静态资源请求时Express.js会自动查找并返回相应的文件,而不需要你在路由中进行特别的处理。

总之,虽然 use 方法本身不是专门用于设置静态资源目录的,但你可以借助于内置的静态文件中间件来实现这一功能。

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端代码实现: 首先,创建一个新的React项目: ``` npx create-react-app todo-app --template typescript ``` 进入项目目录并安装必要的依赖: ``` cd todo-app npm install axios --save npm install @types/axios --save-dev ``` 我们需要使用axios来处理与后端的数据交互。 接下来,创建一个Todo组件,并在其中实现Todo应用的逻辑: ```tsx import React, { useState, useEffect } from 'react'; import axios from 'axios'; interface Todo { id: number; title: string; completed: boolean; } const Todo: React.FC = () => { const [todos, setTodos] = useState<Todo[]>([]); const [newTodo, setNewTodo] = useState<string>(''); useEffect(() => { getTodos(); }, []); const getTodos = async () => { const response = await axios.get('http://localhost:3001/todos'); setTodos(response.data); }; const addTodo = async () => { const response = await axios.post('http://localhost:3001/todos', { title: newTodo, completed: false }); setTodos([...todos, response.data]); setNewTodo(''); }; const deleteTodo = async (id: number) => { await axios.delete(`http://localhost:3001/todos/${id}`); const newTodos = todos.filter((todo) => todo.id !== id); setTodos(newTodos); }; const toggleTodo = async (id: number) => { const todo = todos.find((todo) => todo.id === id); await axios.patch(`http://localhost:3001/todos/${id}`, { completed: !todo?.completed }); const newTodos = todos.map((todo) => todo.id === id ? { ...todo, completed: !todo.completed } : todo ); setTodos(newTodos); }; return ( <div> <h1>Todo App</h1> <div> <input type="text" placeholder="Add new todo" value={newTodo} onChange={(e) => setNewTodo(e.target.value)} /> <button onClick={addTodo}>Add</button> </div> <ul> {todos.map((todo) => ( <li key={todo.id}> <input type="checkbox" checked={todo.completed} onChange={() => toggleTodo(todo.id)} /> <span style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}> {todo.title} </span> <button onClick={() => deleteTodo(todo.id)}>Delete</button> </li> ))} </ul> </div> ); }; export default Todo; ``` 在这个组件中,我们首先定义了一个Todo接口,用于表示Todo数据的结构。然后,我们使用useState来定义了todos和newTodo两个状态变量。 在组件加载完成的时候,我们会调用getTodos函数来获取所有的Todo。 addTodo函数用于添加新的Todo。我们会向后端发送一个POST请求,并将返回的Todo添加到todos数组中。 deleteTodo函数用于删除一个Todo。我们会向后端发送一个DELETE请求,并从todos数组中过滤掉被删除的Todo。 toggleTodo函数用于切换一个Todo的完成状态。我们会向后端发送一个PATCH请求,并更新todos数组中对应的Todo。 最后,在组件的渲染中,我们会展示所有的Todo,并提供添加、删除和切换完成状态的功能。 接下来,我们需要将静态资源编译到node.js的静态资源目录中。在package.json中添加以下代码: ```json "homepage": "/", "scripts": { "start": "react-scripts start", "build": "react-scripts build && cp -r build/* ../backend/public", "test": "react-scripts test", "eject": "react-scripts eject" } ``` 这里,我们使用了cp命令将build目录中的文件复制到backend/public目录中。这样,我们就可以在后端中访问到这些静态资源了。 后端代码实现: 首先,我们需要创建一个新的node.js项目,并安装必要的依赖: ``` npm init -y npm install express cors helmet morgan --save npm install @types/express @types/cors @types/helmet @types/morgan --save-dev ``` 这里,我们使用了express来搭建后端服务器,使用了cors来处理跨域请求,使用了helmet来增强安全性,使用了morgan来记录日志。 接下来,创建一个server.ts文件,并编写以下代码: ```ts import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import morgan from 'morgan'; import fs from 'fs'; import path from 'path'; const app = express(); const port = 3001; const todosFilePath = path.join(__dirname, 'todos.json'); app.use(express.json()); app.use(cors()); app.use(helmet()); app.use(morgan('tiny')); app.get('/todos', (req, res) => { const todos = JSON.parse(fs.readFileSync(todosFilePath).toString()); res.send(todos); }); app.post('/todos', (req, res) => { const todos = JSON.parse(fs.readFileSync(todosFilePath).toString()); const newTodo = { id: todos.length > 0 ? todos[todos.length - 1].id + 1 : 1, ...req.body }; todos.push(newTodo); fs.writeFileSync(todosFilePath, JSON.stringify(todos)); res.send(newTodo); }); app.delete('/todos/:id', (req, res) => { const todos = JSON.parse(fs.readFileSync(todosFilePath).toString()); const newTodos = todos.filter((todo) => todo.id !== parseInt(req.params.id)); fs.writeFileSync(todosFilePath, JSON.stringify(newTodos)); res.send('Todo deleted'); }); app.patch('/todos/:id', (req, res) => { const todos = JSON.parse(fs.readFileSync(todosFilePath).toString()); const todoIndex = todos.findIndex((todo) => todo.id === parseInt(req.params.id)); todos[todoIndex] = { ...todos[todoIndex], ...req.body }; fs.writeFileSync(todosFilePath, JSON.stringify(todos)); res.send('Todo updated'); }); app.listen(port, () => { console.log(`Server listening at http://localhost:${port}`); }); ``` 在这个文件中,我们首先引入了必要的依赖,并创建了一个express应用和一个端口号常量port。 todosFilePath是我们存储Todo数据的文件路径。我们使用fs模块来读写这个文件中的数据。 接下来,我们使用了express的中间件来增强应用的功能。express.json()用于处理请求体中的JSON数据,cors用于处理跨域请求,helmet用于增强安全性,morgan用于记录日志。 我们定义了四个路由: - GET /todos:用于获取所有的Todo。 - POST /todos:用于添加一个新的Todo。 - DELETE /todos/:id:用于删除一个Todo。 - PATCH /todos/:id:用于更新一个Todo的完成状态。 在每个路由的处理函数中,我们都会读取todos.json文件中的数据,并对其进行相应的操作。然后,我们会将修改后的数据写回到文件中,并返回相应的响应。 最后,我们使用app.listen()方法来启动应用,并监听port端口。 在完成了以上代码之后,我们可以使用以下命令来启动应用: ``` npm run build cd ../backend npm start ``` 这样,我们就可以在http://localhost:3000访问到Todo应用了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值