❤Nodejs 第十三章(文件上传接口以及token添加)

简介: 【4月更文挑战第13天】Nodejs第十三章介绍了文件上传接口和Token添加。使用Multer库处理文件上传,设置存储引擎和静态文件目录,定义上传接口,支持单个文件上传。上传成功返回文件信息和访问路径。为解决静态文件访问需要Token认证的问题,更新expressjwt配置,排除包含uploads的路径,确保静态文件可正常访问。

❤Nodejs 第十三章(文件上传接口以及token添加)

写完了图片上传接口以后,简单修改就可以作为我们的文件上传接口使用了,接下来我们完整看看需要哪些部分。

文件上传

(1)导入引用

import multer from 'multer'
import {
    fileURLToPath } from 'url';
import path,{
    dirname, join } from 'path';

(2)设置存储引擎

// 设置存储引擎
const storage = multer.diskStorage({
   
    destination: function (req, file, cb) {
   
        cb(null, 'uploads/');
    },
    filename: function (req, file, cb) {
   
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

(3)配置静态文件目录

// 配置Multer
const upload = multer({
    storage: storage });
// const upload = multer({dest: 'uploads/'}); // 上传
// 设置静态文件路径
// app.use(express.static('uploads'));
app.use('/uploads', express.static('uploads'));

(4)定义文件上传接口


// 处理文件上传
app.post('/api/upload', upload.single('file'), (req, res) => {
   
  // 获取上传的文件信息
  const file = req.file;
  if (!file) {
   
     return res.status(400).send('No file uploaded.');
  }else{
   
    res.json({
   
        code: '200',
        data: file,
        url:`http://localhost:${
     PORT}`+'/uploads/'+req.file.filename,
    });
  }
});

直接测试我们的接口地址http://localhost:8888/api/upload

返回数据如下:

{
   
    "fieldname": "file",
    "originalname": "123.xlsx",
    "encoding": "7bit",
    "mimetype": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    "destination": "uploads/",
    "filename": "file-1714036800721.xlsx",
    "path": "uploads\\file-1714036800721.xlsx",
    "size": 9388
}

image.png

这里我们也可以略微精简一些

浏览器之中打开这个文件查看数据http://localhost:8888/uploads/file-1714036800721.xlsx

image.png

OK!返回数据毫无问题!

(5)优化一下.

接下来加上我们的token认证接口,把之前的token认证接口放开,这个时候你就知道为什么一开始我去掉token了

这个时候我们拿node写图片和文件上传接口就遇到一个问题,如果我加了接口的token验证,然后我的图片上传以后本地的路径访问就需要token授权,这种情况如何解决呢?

我们返回的图片路径如图所示:

image.png

然而我们的图片却不显示

image.png

直接在浏览器访问

image.png

思考:
我们一开始将我们的uploads文件作为我们的静态文件目录,添加token认证以后,无法访问

image.png

那我们是不是可以排除掉所有包含uploads接口达到排除呢?

正则完善一下我们的expressjwt排除接口

  expressJWT.expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({
    // path: [/^\/api\//],
    path: [
            '/',
            '/api/login',
            '/api/register',
            '/api/resetPwd',
            '/api/user',
            '/api/upload',
            '/api/uploadImage',
            `/api/uploadImage:id`,
     ],
    // 排除所有包含uploads的路径
    custom: (req) => {
        return req.originalUrl.includes('/uploads');
    }
  })
);

这个时候我们的图片静态确实没问题了!

image.png

思考:

是不是我们还可以用其他方式完善呢?

这样同样也会给我们上传接口带来不安全的因素,于是我们排除一下上传的接口以外的其他接口需要token(也就是排除排除除了接口'/api/uploadImage'和'/api/upload'以外其他里面携带'/uploads'字符串的请求)

是不是我们还可以用其他方式完善呢?

expressJWT.expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({})这段代码的使用中如何排除所有接口里面携带'/uploads'字符串并且为get的请求?


expressJWT.expressjwt({
    secret: secretKey, algorithms: ["HS256"] }).unless({
    
// 排除除了'/api/uploadImage'和'/api/upload'以外的其他路径且包含/uploads的请求 
custom: (req) => {
    return !['/api/uploadImage', '/api/upload'].includes(req.originalUrl) && req.originalUrl.includes('/uploads'); } })

再次验证,毫无问题

再优化一下,排除post以外的,因为请求路径其实是get

 custom: (req) => {
   
        return req.method !== 'POST' && req.originalUrl.includes('/uploads');
 }

再次验证,已生效!

目录
相关文章
|
7月前
|
存储 JavaScript 中间件
❤Nodejs 第十二章(图片存储接口-本地)
【4月更文挑战第12天】在Node.js第十二章中,主要讲解了错误中间件的编写和multer中间件的使用。错误中间件需置于所有路由之后,用于捕获并处理错误,防止接口崩溃。示例代码展示了如何处理token解析失败的错误。接着介绍了multer,它是处理multipart/form-data数据,尤其是用于文件上传的中间件。通过`yarn add --save multer`安装,并引入到项目中。最终,成功实现了图片上传并返回了可访问的图片路径。
148 2
|
7月前
|
JSON 缓存 JavaScript
❤Nodejs 第十章(用户信息token认证和登录接口开发)
【4月更文挑战第10天】本文介绍了Node.js中实现用户信息token认证和登录接口的步骤。express-jwt的使用,接着创建基本的Express服务器,然后导入并使用jsonwebtoken和express-jwt。设置一个密钥,并定义一个中间件处理token验证。示例展示了登录接口的实现。遇到登录判断失效的问题后,对判断条件进行了优化。
266 2
|
7月前
|
JSON JavaScript 前端开发
❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
【4月更文挑战第9天】Node.js第九章介绍了Token身份认证,特别是JWT(JSON Web Token)作为跨域认证的解决方案。JWT由Header、Payload和Signature三部分组成,用于在客户端和服务器间安全传输用户信息。前端收到JWT后存储在localStorage或sessionStorage中,并在请求头中发送。Express-JWT是一个中间件,用于解析JWT。基本用法包括设置secret和algorithms。注意安全问题,避免混合使用不同算法以防止降级攻击。
121 0
|
7月前
|
存储 JavaScript 数据库
nodejs中express框架实现增删改查接口
nodejs中express框架实现增删改查接口
|
2月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
3月前
|
存储 JSON 前端开发
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
本文介绍了在Node.js中使用token实现前端验证码和登录功能的详细流程,包括生成验证码、账号密码验证以及token验证和过期处理。
66 0
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
|
3月前
|
前端开发 JavaScript 安全
node登陆接口权限配置cookie-parser、express-session
本文介绍了在Node.js中使用express-session和cookie-parser实现登录接口的权限配置,包括验证码接口的生成和自定义中间件的创建,用于验证用户权限。
32 0
node登陆接口权限配置cookie-parser、express-session
|
3月前
|
JavaScript 前端开发
vue配合axios连接express搭建的node服务器接口_简单案例
文章介绍了如何使用Express框架搭建一个简单的Node服务器,并使用Vue结合Axios进行前端开发和接口调用,同时讨论了开发过程中遇到的跨域问题及其解决方案。
67 0
vue配合axios连接express搭建的node服务器接口_简单案例
|
7月前
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
|
4月前
|
JavaScript 前端开发 Linux
【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()