node.js - '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}`));
解决方案
const user = await usersRepository.findOne(req.params.id) 返回 user 或 undefined 因为它不能保证给定 ID 的用户存在。
usersRepository.merge 需要一个users
Type 并且您正在提供它类型,如果您在 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"})
推荐阅读
- ssl - 通过 Let's Encrypt 在 digitalocean droplet 为我的域获取 SSL 证书时出现问题
- awk - 批量更新文本文件中的一行
- android - 未能通过 # 作为拨号应用程序中的输入
- c# - Swagger UI 输出“不支持的媒体类型”
- xamarin - MVVM Xamarin Forms,最适合在等待来自服务调用的几分钟响应时将函数保留在内存中
- amazon-web-services - 在foreach循环中执行powershell命令
- java - Spring ExceptionalHandler 的 Java 测试
- typescript - 在默认导出和命名导出中导出一个值(循环)
- sql - 使用 sql 脚本将文本文件从一个文件夹移动到另一个文件夹
- python - 如何在 Django 管理模板中检查当前查看的模型的权限