我正在尝试在我的API之上实现抽象。我需要一个axios客户端的实例,以便以后可以拦截请求。使用下面的代码,我尝试重用同一实例。当我在视图层中导入函数(即身份验证)时,下面的代码是否保证只有一个axios客户端?如果是这样,为什么?
index.ts
import axios from 'axios'
export const baseUrl = 'http://localhost:8080';
export const axiosClient = axios.create();
session.ts
import {axiosClient, baseUrl} from './index'
import {User} from "../_models/user";
interface AuthenticateResponse {
token: string,
user: User
}
export function authenticate(username: string, password: string) :Promise<User> {
let formData = new FormData();
formData.set('username', username);
formData.set('password', password);
return axiosClient.post(baseUrl + '/login', formData)
.then(resp => {
let authResp: AuthenticateResponse = JSON.parse(resp.data);
localStorage.setItem('token', authResp.token);
return authResp.user
})
}
答案 0 :(得分:0)
如果出于某种原因未从两个不同的位置导入index
模块,则应该没问题,因为模块是根据其文件名加载的。如果require
解析为相同的文件名,它将返回相同的模块,并且该代码仅应执行一次,并且单例仅应实例化一次。
https://nodejs.org/api/modules.html#modules_module_caching_caveats
大多数前端框架都提供了处理单例的机制。一些例子:
https://angular.io/guide/singleton-services
https://github.com/mobxjs/mobx-react#provider-and-inject
我个人不会依靠require
来创建单例。最好使用Web框架机制或以某种方式调整架构,以使应该是单例的对象通过层次结构传递。
将函数传递给authenticate
可能是一个主意,该函数在请求返回后或您需要时执行。