在async/await中如何将用户查询返回的Null纳入错误捕获块?
在async/await中让Null触发错误捕获的方案
嘿,这个问题其实很好解决——在async/await的逻辑里,你只需要主动抛出错误,就能让查询返回的null触发后续的catch块,和你之前用Promise时reject(null)的效果完全一致。
核心思路
async函数本质是Promise的语法糖:
- 如果函数正常返回值(包括
null),会被包装成resolved状态的Promise,await会直接拿到这个值,不会进入catch - 只有当函数内部抛出错误(用
throw关键字),才会被包装成rejected状态的Promise,此时await会触发后续的catch块
具体代码实现
第一步:修改控制器(accountController.js)
在获取用户的异步函数里,判断查询结果是否为null,如果是则主动抛出错误:
// accountController.js async function getUserById(req) { // 假设这里是你的数据库查询逻辑,比如从MongoDB/MySQL获取用户 const user = await UserModel.findById(req.params.id); // 如果查询结果为null,主动抛出错误 if (!user) { // 推荐抛出Error对象,方便后续捕获时获取错误信息 throw new Error('用户不存在'); // 如果你想直接抛null也可以,但不推荐,因为Error对象能提供更多上下文 // throw null; } // 查询到用户则正常返回 return user; }
第二步:修改路由(routes.js)
用try/catch包裹await调用,捕获控制器抛出的错误:
// routes.js router.get('/user/:id', async (req, res) => { try { // 调用控制器的异步函数 const user = await accountController.getUserById(req); // 只有查询到用户才会走到这里,返回成功响应 res.status(200).json(user); } catch (err) { // 这里捕获到控制器抛出的错误(包括null的情况) // 根据错误类型返回对应的响应,比如404状态码 res.status(404).json({ message: err.message || '用户不存在' }); } });
进阶优化:自定义错误类
如果你的项目需要区分不同类型的错误(比如NotFound、BadRequest等),可以自定义错误类,让错误处理更精准:
// 自定义NotFound错误类 class NotFoundError extends Error { constructor(message) { super(message); this.statusCode = 404; this.name = 'NotFoundError'; } } // 控制器里抛出自定义错误 if (!user) { throw new NotFoundError('用户不存在'); } // 路由里的catch块可以根据错误类型处理 catch (err) { const statusCode = err.statusCode || 500; const message = err.message || '服务器内部错误'; res.status(statusCode).json({ message }); }
这样就能完美实现你想要的效果:当查询返回null时,进入路由的catch块处理错误响应,和Promise中reject(null)的逻辑完全对齐。
内容的提问来源于stack exchange,提问作者Pak Chu
相关产品推荐
相关产品推荐

