Feathers应用异步注册服务问题:如何在服务就绪后再获取服务
解决Feathers服务异步注册后获取为null的问题
我明白你遇到的问题了——因为服务是在ORM异步初始化完成后才注册的,而你当前的app()函数是同步返回实例的,这导致第一次调用service('team')时,服务还没完成注册,自然返回null。
下面是两种可行的修改方案,核心思路是让应用实例的创建和服务的获取都变成异步操作,确保你拿到服务的时候它已经注册完成。
方案一:使用async/await简化异步流程
首先修改你的app和service函数,让它们返回Promise:
let instance; export async function app() { // 如果实例已经存在,直接返回 if (instance) return instance; // 初始化Feathers应用 instance = express(feathers()); // 等待ORM初始化完成 await ORM.default; // 执行服务注册相关操作 setupServices(); instance.configure(initServices); return instance; } export async function service(name) { // 确保应用实例已经完成所有服务注册 const appInstance = await app(); return appInstance.service(name); }
然后在使用服务的地方,需要通过await或者.then()来获取:
import { service } from '../app'; // 在异步函数中使用await async function fetchTeams() { const teamService = await service('team'); const teams = await teamService.find(); // 处理teams数据 } // 或者使用.then()链式调用 service('team').then(teamService => { teamService.create({ name: 'New Team' }) .then(newTeam => console.log('Created team:', newTeam)); });
方案二:防止重复初始化的优化版本
如果担心多次调用app()会重复触发ORM初始化,可以把实例的创建包装成一个Promise,避免重复执行异步操作:
let instance; let instancePromise; export function app() { // 如果实例已存在,直接返回resolved Promise if (instance) return Promise.resolve(instance); // 如果正在初始化,返回已有的Promise if (instancePromise) return instancePromise; // 创建初始化Promise instancePromise = (async () => { instance = express(feathers()); await ORM.default; setupServices(); instance.configure(initServices); return instance; })(); return instancePromise; } export async function service(name) { const appInstance = await app(); return appInstance.service(name); }
为什么原来的代码会出问题?
你原来的app()函数同步返回了instance,但ORM.default.then()里的服务注册逻辑是异步执行的——也就是说,当你调用service('team')时,instance已经被返回了,但initServices还没执行完,服务根本没注册到应用上,所以app().service(name)找不到对应的服务,返回null。
通过让app()和service()都变成异步的,我们就能确保只有在所有服务都注册完成后,才会返回对应的服务实例。
内容的提问来源于stack exchange,提问作者Elminday
相关产品推荐
相关产品推荐

