Loopback新手求助:如何重写模型记录不存在时的404响应体?
自定义LoopBack模型未找到时的404响应体
嘿,我来帮你搞定这个问题!在LoopBack里重写MODEL_NOT_FOUND的404响应格式其实很简单,下面分两种主流版本给你具体实现步骤:
针对LoopBack 4版本
LoopBack 4推荐使用全局错误处理器来统一拦截并自定义错误响应,步骤如下:
1. 创建自定义错误处理器类
在项目中新建一个错误处理文件(比如src/error-handlers/custom-error.handler.ts),写入以下代码:
import {ErrorHandler, inject, injectable} from '@loopback/core'; import {HttpErrors, Request, Response, RestBindings} from '@loopback/rest'; import {ModelNotFoundError} from '@loopback/repository'; @injectable({tags: {key: ErrorHandler.BINDING_KEY}}) export class CustomErrorHandler implements ErrorHandler { constructor( @inject(RestBindings.Http.REQUEST) private request: Request, @inject(RestBindings.Http.RESPONSE) private response: Response, ) {} handleError(error: Error): void { // 专门拦截模型未找到的错误 if (error instanceof ModelNotFoundError) { this.response.status(404).json({ status: 404, message: error.message, }); return; } // 其他HTTP错误统一格式化 if (error instanceof HttpErrors.HttpError) { this.response.status(error.statusCode).json({ status: error.statusCode, message: error.message, }); } else { // 未知错误返回500默认响应 this.response.status(500).json({ status: 500, message: 'Internal Server Error', }); } } }
2. 在应用中注册错误处理器
打开src/application.ts,注册刚才创建的错误处理器:
import {CustomErrorHandler} from './error-handlers/custom-error.handler'; // ...其他导入 export class YourAppNameApplication extends BootMixin( ServiceMixin(RepositoryMixin(RestApplication)), ) { constructor(options: ApplicationConfig = {}) { super(options); // 注册自定义错误处理器 this.bind(ErrorHandler.BINDING_KEY).toClass(CustomErrorHandler); // ...其他原有配置 } }
针对LoopBack 3版本
LoopBack 3可以通过全局remoteError钩子来快速实现,步骤如下:
打开项目的server/server.js,添加以下代码:
module.exports = function(app) { // 监听全局远程调用错误 app.on('remoteError', function(ctx, err, next) { // 判断错误码是否为MODEL_NOT_FOUND if (err.code === 'MODEL_NOT_FOUND') { ctx.res.status(404).send({ status: 404, message: err.message }); return; // 终止后续默认处理 } // 其他错误继续使用默认响应逻辑 next(); }); // ...原有server配置 };
验证效果
启动你的LoopBack服务后,调用一个不存在的模型ID接口(比如GET /your-model/666),就能得到你期望的响应格式:
{ "status": 404, "message": "could not find a model with id 666" }
内容的提问来源于stack exchange,提问作者rslhdyt
相关产品推荐
相关产品推荐

