Wangjili
文章58
标签12
分类9
nestjs

nestjs

Nest.js是一个渐进的Node.js框架,可以在TypeScriptJavaScript (ES6、ES7、ES8)之上构建高效、可伸缩的企业级服务器端应用程序。它的核心思想是提供了一个层与层直接的耦合度极小、抽象化极高的一个架构体系。

本文记录遇到的开发问题和解决方式

一、上传文件中文乱码

在服务端接收到上传文件的数据时,如果originalname包含中文或其它非英文的字符,会导致文件名乱码,解决方法如下:

// 假设我们接收到的是单文件为 file; 多文件遍历就可以了。
const file.originalname = Buffer.from(file.originalname,'latin1').toString('utf-8');
// 此时文件名就可以正确显示了

二、前端连接websocket网关时,无法连接

nestjs中创建的WebSocketGateway链接,当本地测试时,会出现GET http://localhost:xxxx/socket.io/?EIO&transport=polling net::ERR CONNECTION_REFUSED&类似的问题,原因是连接websocket时,**必须写服务器的真实IP 地址**,不能使用localhost的方式进行测试,重要。

三、nestjs 使用session时,无法获取session值

记录在nestjs中使用express-session的正确方式。

  1. 服务端(直接看代码)
    • 安装包
      yarn add express-session  
      yarn add -D @types/express-session
    • main.ts中加入一下代码
      // 其它代码...
      
      // 注意:如果你的开发涉及跨域,跨域的配置必须写在 session 配置的前面。
      // credentials:true, 这在同域几乎没用,但是在跨域的时候,它可以允许跨域请求携带cookie, 
      // 设置了上面的属性,则 origin 不能是 * ,必须是完整的地址
      app.enableCors({credentials:true,origin:'http://localhost:3001'});   // 跨域配置
      app.use(session({  // session 配置,从 express-session 导入,具体配置参数详情可自行前往官网学习
          secret:'my-secret',  
          cookie: {
              maxAge: 60000,  
              httpOnly:true,  
          },
          resave: false,  
          saveUninitialized: false,
          name: "my-session",
          rolling:true,
      }))
    • user.controller.ts中使用。
      // 导入必须的库
      @Controller('user')
      export class UserController{
          @Get('authcode')
          async getCode(@Request() req,@Response() res){
              req.session.code = "1234";  // 此处在请求中设置了 session
              return "get code success";
          }
      
          @Post('login')
          login(@Body() body,@Request() req){
              const {code} = body;
              console.log(req.session.code);
              if (code?.toUpperCase() === req.session.code?.toUpperCase()) {
                  console.log('验证码通过');
                  return 'hello authocode';
              } else {
                  console.log('验证码未通过');
                  return 'code error';
              }
          }
      }
      
  2. 客户端
    import axios from "axios";
    axios.defaults.withCredentials = true;  // 配置此项即可,就可以正确使用了
本文作者:Wangjili
本文链接:https://blog.wangjili.cn/2023/01/02/nestjs/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可