我正在学习AngularJs17,并创建了一个登录应用程序. 但是,服务器的响应没有映射到Model Class的对象.

答复:

    {
    "id": 1,
    "userName": "admin",
    "email": "admin@gmail.com",
    "password": "",
    "role": 1,
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNzA1NzQwMTkzLCJleHAiOjE3MDU3NDE5OTN9.obH83er-eb0Pcl_OLXhwPj7kXUy9lNh0EK3NInr3Eas"
}

模型:

export class LoginViewModel {
    UserName: string;
    Password: string;
    constructor(){
        this.UserName = "";
        this.Password = "";
    }
}

服务:

public Login(loginView模型: LoginViewModel): Observable<LoginViewModel> {
return this.httpClient.post<LoginViewModel>(this.NODE_HOST + "/api/authenticate",loginViewModel,{responseType: "json"}).pipe(
  map(user =>{
    if(user) {
      var userData = JSON.parse(JSON.stringify(user));
      this.currentUser = user.UserName;
      console.log("userData-UserName: ", userData.userName);
      console.log("User: ", JSON.stringify(user));
      sessionStorage.setItem('currentUser', JSON.stringify(user));
    }
    return user;
  })
);

}

在服务中,我可以使用stringifyparsing来破解它,以获得json struct 中的用户数据,然后我可能能够使用该 struct 初始化一个新的userObj,但这似乎是一种肮脏的方式.

在Udemy课程中,使用Angular 11的 struct 能够自动将数据获取到ModelClass中,而在我的(Angular 17)中,这是不可能的.

推荐答案

我认为情况是错误的,在你的API中它是username,在你的界面中它是UserName,你能修复它吗,也许它会起作用!

我不认为你需要post的第三个参数,首先是URL,然后是帖子正文,就足够了!

Angular 会自动将API响应转换为对象,不需要JSON.parse(JSON.stringify((user))

接口<;-如果请求也有userName而不是UserName,请更改此设置,否则不需要

export class LoginViewModel {
    userName: string;
    password: string;
    constructor(){
        this.userName = "";
        this.password = "";
    }
}

服务

public Login(loginViewModel: LoginViewModel): Observable<LoginViewModel> {
return this.httpClient.post<LoginViewModel>(this.NODE_HOST + "/api/authenticate", loginViewModel).pipe(
  map(user =>{
    if(user) {
      const userData = user; // <- changed here
      this.currentUser = user.userName; // <- changed here
      console.log("userData-UserName: ", userData.userName);
      console.log("User: ", JSON.stringify(user));
      sessionStorage.setItem('currentUser', JSON.stringify(user));
    }
    return user;
  })
);

Typescript相关问答推荐

TypScript在对象上强制执行值类型时推断对象文字类型?

TypeScript:在作为参数传递给另一个函数的记录中对函数的参数实现类型约束

如何使函数接受类型脚本中具有正确类型的链接修饰符数组

对数组或REST参数中的多个函数的S参数进行类型判断

如何使默认导出与CommonJS兼容

路由链接始终返回到

在列表的指令中使用intersectionObservable隐藏按钮

在Mac和Windows上运行的Web应用程序出现这种对齐差异的原因是什么?(ReactNative)

基元类型按引用传递的解决方法

使用条件类型的类型保护

TYPE FOR ARRAY,其中每个泛型元素是单独的键类型对,然后在该数组上循环

->;Boolean类型的键不能分配给类型Never

类型实例化过深,可能是无限的&TypeScrip中的TupleUnion错误

埃斯林特警告危险使用&as";

为什么我会得到一个;并不是所有的代码路径都返回一个值0;switch 中的所有情况何时返回或抛出?(来自vsCode/TypeScript)

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?

Typescript泛型验证指定了keyof的所有键

带有过滤键的 Typescript 映射类型

如何在 TypeScript 类型定义中简化定义长联合类型

如果父级被删除或删除,如何自动删除子级?