You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:45:33