首页 > 解决方案 > 'users | 类型的参数 undefined' 不能分配给'users' 类型的参数。类型“未定义”不可分配给类型“用户”

问题描述

我试图用 TYPEORM 创建一个 put 方法,但不明白如何修复这个错误以及为什么。这个请求是 typeof? 但我的用户是有价值的。(我是新手,当然)。

任何人都可以帮助我吗?我该如何解决?

什么时候 :

 const user: any = await usersRepository.findOne(req.params.id)

所以:没问题(为什么)

错误:

{
    "resource": "/Users/camargo/Documents/Estudo/nodejs-1/source/server.ts",
    "owner": "typescript",
    "code": "2345",
    "severity": 8,
    "message": "Argument of type 'users | undefined' is not assignable to parameter of type 'users'.\n  Type 'undefined' is not assignable to type 'users'.",
    "source": "ts",
    "startLineNumber": 71,
    "startColumn": 31,
    "endLineNumber": 71,
    "endColumn": 35
}

代码

    ** source/server.ts */
    import http from 'http';
    import { connection } from "./connection/connection"
    import express, { Express } from 'express';
    import morgan from 'morgan';
    import routes from './routes/posts';
    
    
    import cors from "cors";
    import { users } from './entities/users';
    
    // Setando rotas express
    
    const router: Express = express();
    const app=express()
    app.use(cors())
    app.use(express.json())
    const server=app.listen(3000,()=>{
        console.log("Server rodando... 3000....")
    })
    app.get("/api",(req,res)=>{
        res.send("API - Bem Vindo")
    })
    connection.then(
        async connection=>{
            console.log("Conectado")
          
      const usersRepository = connection.getRepository(users);
    
      app.get("/api/users/:id",async(req,res)=>{
    
        /* Metodos */
    
        //METODO GET 
    
        const user = await usersRepository.findOne({where: { id: req.params.id }})
        res.json({
            message:"success",
            payload: user
        })
    })
    
        //  METODO POST
    
    app.post("/api/users",async (req,res)=>{
                
        console.log("body",req.body)
        const user = await usersRepository.create(req.body)
        const results = await usersRepository.save(user);
        
    res.json({
    message: "success",
    payload: results
    });
    })
    
        // METODO DELETE
    
        app.delete("/api/users/:id",async(req,res)=>{
            const user = await usersRepository.delete(req.params.id)
            res.json({
                message:"success",
            })
        })
    
           
            //METODO PUT
    
        app.put("/api/users/:id",async(req,res)=>{
            const user = await usersRepository.findOne(req.params.id)
            usersRepository.merge(user, req.body);
            const result = await usersRepository.save(user);
            res.json({
                message:"success",
                payload:result
            })
      
        })
            
        
    }
    ).catch(error=>{
        console.log(error)
        
    })
    
    
    /** Conexao teste morgan */
    router.use(morgan('dev'));
    /** Parse the req */
    router.use(express.urlencoded({ extended: false }));
    /** Takes care of JSON data */
    router.use(express.json());
    
    /** Regras da API*/
    router.use((req, res, next) => {
        // CORS 
        res.header('Access-Control-Allow-Origin', '*');
        // CORS headers
        res.header('Access-Control-Allow-Headers', 'origin, X-Requested-With,Content-Type,Accept, Authorization');
        // CORS metodos
        if (req.method === 'OPTIONS') {
            res.header('Access-Control-Allow-Methods', 'GET PATCH DELETE POST');
            return res.status(200).json({});
        }
        next();
    });
    
    /** Routes */
    router.use('/', routes);
    
    /** Error handling */
    router.use((req, res, next) => {
        const error = new Error('not found');
        return res.status(404).json({
            message: error.message
        });
    });
    
    /** Server */
    
    const httpServer = http.createServer(router);
    const PORT: any = process.env.PORT ?? 6060;
    httpServer.listen(PORT, () => console.log(`Server rodando em ${PORT}`));

标签: node.jstypescriptexpresscrudtypeorm

解决方案


const user = await usersRepository.findOne(req.params.id) 返回 user 或 undefined 因为它不能保证给定 ID 的用户存在。

usersRepository.merge 需要一个usersType 并且您正在提供它类型,如果您在 tsconfig.jsonusers|undefined中启用,它们彼此不兼容strictNullChecking

要解决此问题,您必须先对其进行空检查:

const user = await usersRepository.findOne(req.params.id)
if(user) {
  usersRepository.merge(user, req.body);
  const result = await usersRepository.save(user);
  res.json({
      message:"success",
      payload:result
  })
}
res.status(404).json({message: "user not found"})

推荐阅读