TypeScript async/await调用返回null问题排查及代码修正请求
解决TypeScript async/await登录接口返回null问题
问题根源
fetchData作为async函数未返回值,且内部调用fetch时未用await,导致函数默认返回Promise<undefined>,后续validateUser中user为undefined,访问user.id触发错误,进入login函数的catch分支返回null。validateUser中的GraphQL查询存在语法错误(多了一个逗号),且硬编码邮箱密码,未使用传入的input参数。validateUser中无需手动调用Promise.resolve,async函数会自动将返回值包装为Promise。
修正后的代码
1. Fetch函数修正
async validateUser( input: ValidateUserInput, ): Promise<ValidateUserModel | null> { // 修正查询语法,使用传入的参数而非硬编码值 const query: string = `query validateUser { validateUser(email: "${input.email}", password: "${input.password}") {id, email} }`; const user = await this.fetchData(this.url, query); // 新增空值检查,避免后续属性访问报错 if (!user) return null; return new ValidateUserModel(user.id, user.email); } async fetchData(url: string, query: string): Promise<any> { // 给fetch添加await,并返回解析后的JSON结果 const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query: query }), }); return res.json(); }
2. 登录函数优化(增强容错性)
async login(loginInput: LoginInput): Promise<Login | null> { if (!loginInput || !loginInput.email || !loginInput.password) return null; try { const user = await this.userService.validateUser({ email: loginInput.email, password: loginInput.password, }); // 新增user空值检查 if (!user) return null; const login: Login = new Login(); login.accessToken = user.id; login.refreshToken = user.email; return login; } catch (err) { // 打印错误日志便于排查 console.error('登录验证失败:', err); return null; } }
3. Query定义保持不变
@Query(() => Login, {nullable: true}) async login(@Args('login') loginInput: LoginInput) { return await this.loginService.login(loginInput); }
内容的提问来源于stack exchange,提问作者g_m
相关产品推荐
相关产品推荐

