Loopback 3 REST服务中使用async/await替代回调函数的实现咨询
LoopBack 3 中使用 async/await 替代回调的正确姿势
当然可以!LoopBack 3完全支持async/await语法——只要你的Node.js版本在7.6及以上(这个版本开始Node.js原生支持async/await,不用额外转译),就能顺利替换传统的回调写法。
先说说你的现有写法:虽然能跑,但其实没必要同时保留callback参数和async/await,可以优化得更简洁纯粹,同时贴合LoopBack的设计逻辑。
核心原理:LoopBack 内置方法支持 Promise 接口
LoopBack 3的绝大多数内置模型方法(比如find、create、update等)都同时支持回调和Promise两种调用方式:当你不传入回调函数时,方法会自动返回一个Promise,这正是await需要的前提。
优化后的纯 async/await 写法
如果你的myFunction是自定义的模型方法(不管是不是远程方法),可以直接写成返回Promise的async函数:
MyModel.myFunction = async () => { try { // 不传入回调,find方法返回Promise,直接用await接收结果 const data = await MyModel.find({where: {id: 2}}); return data; } catch (e) { console.error('查询出错:', e); // 把错误抛出,让调用方(或LoopBack框架)处理 throw e; } };
如果是远程方法的特殊处理
如果myFunction是要暴露给前端的远程方法,LoopBack会自动处理async函数的返回值和错误:
// 先定义远程方法元数据 MyModel.remoteMethod('myFunction', { returns: {arg: 'data', type: 'object', root: true}, http: {path: '/get-specific-data', verb: 'get'} }); // 然后实现async版本的方法 MyModel.myFunction = async () => { // 直接返回查询结果,LoopBack会自动转为HTTP响应 return await MyModel.find({where: {id: 2}}); };
这里甚至可以省略try/catch——如果find抛出错误,LoopBack会自动捕获并转为合适的HTTP错误响应(比如500状态码),当然你也可以自己加try/catch做自定义错误处理。
兼容旧回调代码的方案(可选)
如果需要兼容依赖回调的旧代码,可以用Node.js内置的util.promisify把async函数转成支持回调的形式,或者手动处理:
const util = require('util'); // 先定义纯async方法 MyModel._myFunction = async () => { return await MyModel.find({where: {id: 2}}); }; // 转成支持回调的版本 MyModel.myFunction = util.promisify(MyModel._myFunction);
不过更推荐逐步迁移到纯async/await写法,让代码更易读易维护。
注意事项
- 确保Node.js版本≥7.6,或者如果用更低版本,需要用Babel转译(但不推荐,尽量升级Node.js)
- 所有LoopBack内置模型方法都可以用这种方式替换回调,不止
find - 自定义方法中,
await只能用在async函数内部,不要在非async函数里直接用
内容的提问来源于stack exchange,提问作者khernik
相关产品推荐
相关产品推荐

