【问题标题】:Node.js Express API with TypeScript 3 Update a record使用 TypeScript 3 的 Node.js Express API 更新记录
【发布时间】:2021-03-05 13:37:22
【问题描述】:

我已经设置了Node.js Express API with TypeScript 3,它工作正常。 我在尝试更新记录时遇到问题。

RecordsRouter.ts

import { Router } from 'express';
import {RecordComponent} from '../../components';

const router: Router = Router();
router.get('/', RecordComponent.findAll);
router.get('/:id', RecordComponent.findOne);
router.post('/', RecordComponent.create);
router.delete('/:id', RecordComponent.remove);
router.put('/:id', RecordComponent.update);

export default router;

我的 RecordComponent.ts

export async function update(req: Request, res: Response, next: NextFunction): Promise <void> {
    try {
        const record: IRecord = await RecordService.put(req.body)

        res.status(201).json(record);
    } catch (error) {
        next(new HttpError(error.message.status, error.message));
    }
}

还有我的 IRepository.ts

 export interface IRepository<T> {
    findAll(): Promise<T[]>;
    findOne(code: string): Promise<T>;
    insert(T: any): Promise<T>;
    remove(id: string): Promise<T>;
    put:(T: any)=>Promise<T>;
}

服务.ts

异步放置(数据:IRecord):承诺{ 尝试 { 常量验证:Joi.ValidationResult = RecordValidation.updateRecord(data);

            if(validate.error) {
                throw new Error(validate.error.message);
            }

            return await RecordModel.findOneAndUpdate(data);
        } catch (error) {
            throw new Error(error.message);
        }
    },

我是否都做对了,还是因为我收到错误而丢失了某些东西

【问题讨论】:

  • 我假设你忘记在 RecordService 对象中声明put 方法
  • 是的,你是对的。
  • 可以分享Record/service.ts吗?如果没有完整的上下文,很难修复它。您还可以分享 github 最小可重现 repo

标签: node.js typescript rets


【解决方案1】:

所以,你应该用下一种方式实现 RecordService:

const RecordService:IRepository<IRecord>={
  // ...some code for findAll, findOne ....
  remove:(id: string)=>Promise.resolve(),
  put:(id: string)=>Promise.resolve(),  
}

更新

您的 RecordModel.findOneAndUpdate(data) 应该收到 0 个参数:

RecordModel.findOneAndUpdate()RecordModel.findOneAndUpdate(data, other, another)

请熟悉mongoose docs

【讨论】:

  • 返回等待 RecordModel.findOneAndUpdate(data);我现在收到此错误
  • 非常感谢您的帮助
  • 能否在您的问题中提供新的错误?
  • 我更新了问题。我不明白 RecordModel.findOneAndUpdate(data);它来自i.stack.imgur.com/20hzY.png
  • 非常感谢,帮了大忙!
【解决方案2】:

这意味着您没有实现RecordService 中的所有接口成员。要么实现它们,要么在IRepository 接口中通过在冒号前添加问号将它们标记为可选:

export interface IRepository<T> {
    findAll()?: Promise<T[]>;
    findOne(code: string)?: Promise<T>;
    insert(T: any)?: Promise<T>;
    remove(id: string)?: Promise<T>;
    put(id: string)?: Promise<T>;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2020-02-02
    • 2021-03-11
    • 2021-10-10
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多