返回

Node.js 实战:文件上传 - 用 Express 搭建博客(三)

前端

搭建一个功能齐全的博客:文件上传和接口鉴权

前言

在现代数字世界中,博客是一个分享知识、观点和创意的宝贵平台。使用 Node.js 和 Express 框架,我们可以创建功能强大的博客,不仅可以展示内容,还可以实现文件上传和接口鉴权等关键功能。

文件上传

1. 安装 multer 中间件

要实现文件上传,我们需要安装 multer 中间件,它允许我们在 Express 应用程序中轻松处理文件上传。通过运行以下命令,我们可以安装 multer

npm install multer

2. 配置 multer 中间件

接下来,我们需要配置 multer 中间件,指定上传文件的存储方式和命名约定。我们可以使用 diskStorage 来将文件存储在本地文件系统中,并为每个文件指定一个唯一的文件名:

const storage = multer.diskStorage({
  destination: 'uploads/',
  filename: (req, file, cb) => {
    cb(null, Date.now() + '-' + file.originalname);
  }
});

const upload = multer({ storage: storage });

3. 使用 multer 中间件处理文件上传

一旦配置好 multer 中间件,就可以在 Express 路由中使用它来处理文件上传。我们可以创建一条 POST 路由,使用 upload.single('file') 中间件,该中间件会处理单个文件上传:

app.post('/upload', upload.single('file'), (req, res) => {
  res.send('File uploaded successfully!');
});

接口鉴权

1. 安装 jsonwebtoken 库

为了保护我们的博客免受未经授权的访问,我们需要实现接口鉴权。为此,我们将使用 jsonwebtoken 库,它允许我们创建和验证 JSON Web 令牌 (JWT):

npm install jsonwebtoken

2. 创建 JWT 令牌

JWT 令牌是包含用户相关信息(例如 ID 和用户名)以及到期时间的加密字符串。我们可以使用 jwt.sign() 方法创建 JWT 令牌:

const jwt = require('jsonwebtoken');

const token = jwt.sign({ id: user.id, username: user.username }, 'secret', { expiresIn: '1h' });

3. 在请求头中添加 Authorization 字段

在发出请求时,需要在请求头中包含 JWT 令牌。我们可以使用 Authorization 字段,其值是 Bearer 前缀后跟 JWT 令牌:

Authorization: 'Bearer ' + token

4. 在服务器端验证 JWT 令牌

在服务器端,我们需要验证 JWT 令牌以确保请求的合法性。我们可以使用 jwt.verify() 方法,它将解析和验证 JWT 令牌:

const jwt = require('jsonwebtoken');

app.use((req, res, next) => {
  const token = req.headers['authorization'];
  if (token) {
    jwt.verify(token, 'secret', (err, decoded) => {
      if (err) {
        res.sendStatus(401);
      } else {
        req.decoded = decoded;
        next();
      }
    });
  } else {
    res.sendStatus(401);
  }
});

总结

通过结合 Node.js、Express 和 multerjsonwebtoken 库,我们成功地创建了一个功能齐全的博客,实现了文件上传和接口鉴权。这些功能对于维护博客的安全性和提供用户友好的体验至关重要。

相关资源

常见问题解答

  1. 如何保护文件免遭未经授权的访问?
    可以使用 multer 中间件限制文件上传的权限,并且可以在服务器端验证 JWT 令牌以确保只有授权用户才能访问文件。

  2. JWT 令牌存储在什么地方?
    JWT 令牌通常存储在客户端,例如在浏览器中或移动设备上的本地存储中。

  3. 为什么使用 JWT 进行接口鉴权?
    JWT 是轻量级、无状态且易于验证的,使其成为实现接口鉴权的理想选择。

  4. 如何处理 JWT 令牌到期?
    可以使用 JWT 的 expiresIn 属性指定令牌的到期时间。到期后,令牌将不再有效,并且需要生成新的令牌。

  5. 如何防止 JWT 令牌被盗?
    JWT 令牌应使用安全且保密的密钥进行签名,并且应通过安全协议(例如 HTTPS)传输。