---
# System prepended metadata

title: '[Vue] 在獨立的 js 檔內使用 Pinia 時出現錯誤訊息 no active Pinia'
tags: [Vue.js]

---

# [Vue] 在獨立的 js 檔內使用 Pinia 時出現錯誤訊息 no active Pinia


###### tags: `Vue`


## 問題
在 axios `interceptors` 內使用 `Pinia` 時得到以下錯誤訊息
:::danger
Uncaught Error: [🍍]: "getActivePinia()" was called but there was no active Pinia. Did you forget to install pinia?
	const pinia = createPinia()
	app.use(pinia)
This will fail in production.
:::
```javascript
// api/index.js
import axios from 'axios';
import useFetchStore from '@/stores/fetch';

const instance = axios.create({
  baseURL: 'xxx',
});

const fetchStore = useFetchStore();
const { handleResponse } = fetchStore;

instance.interceptors.response.use(
  (response) => {
    handleResponse(response.status);

    return response;
  },
  (error) => {
    if (axios.isAxiosError(error)) {
      handleResponse(error.status);
    } else {
      console.log('unexpectedError: ', error);
    }

    return Promise.reject(error);
  },
);
```


## 解法
### 解法一：在 `interceptors` 內使用 store
```javascript
// api/index.js
import axios from 'axios';
import useFetchStore from '@/stores/fetch';

const instance = axios.create({
  baseURL: 'xxx',
});

instance.interceptors.response.use(
  (response) => {
    const fetchStore = useFetchStore();
    const { handleResponse } = fetchStore;
    handleResponse(response.status);

    return response;
  },
  (error) => {
    const fetchStore = useFetchStore();
    const { handleResponse } = fetchStore;
    if (axios.isAxiosError(error)) {
      handleResponse(error.status);
    } else {
      console.log('unexpectedError: ', error);
    }

    return Promise.reject(error);
  },
);
```

### 解法二：創建 store.js，在檔案內 import Pinia
若不想採用[解法一](#解法一：在-interceptors-內使用-store)在所有 `interceptors` 內一直宣告，可以將程式碼獨立出來，需要 Pinia 的地方再 `import`
1. 創建 `stores/store.js`
    ```javascript
    import { createPinia, setActivePinia } from 'pinia';

    const pinia = createPinia();
    setActivePinia(pinia);

    export default pinia;
    ```
2. 修改 `main.js`
    ```javascript
    import { createApp } from 'vue';

    // import { createPinia } from 'pinia'; // 刪除
    import pinia from '@/stores/store'; // 新增

    import App from './App.vue';
    import router from './router';

    const app = createApp(App);

    // app.use(createPinia()); // 刪除
    app.use(pinia); // 新增

    app.use(router);

    app.mount('#app');
    ```
3. 修改 `api/index.js`
    1. 使用 ESLint 要加：`// eslint-disable-next-line no-unused-vars`
    2. 使用 ESLint 和 TypeScript 要加：`// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars`
    ```javascript
    import axios from 'axios';
    import pinia from '@/stores/store';
    import useFetchStore from '@/stores/fetch';

    const instance = axios.create({
      baseURL: 'xxx',
    });

    const fetchStore = useFetchStore();
    const { handleResponse } = fetchStore;

    instance.interceptors.response.use(
      (response) => {
        handleResponse(response.status);

        return response;
      },
      (error) => {
        if (axios.isAxiosError(error)) {
          handleResponse(error.status);
        } else {
          console.log('unexpectedError: ', error);
        }

        return Promise.reject(error);
      },
    );
    ```


## 參考資料
* [解法一參考資料：How to use Pinia outside a component in js file](https://stackoverflow.com/a/72340936 "How to use Pinia outside a component in js file - Stack Overflow")
* [解法二參考資料：Larvel-mix + Pinia throws an error: getActivePinia was called with no active Pinia](https://stackoverflow.com/a/73221064 "laravel - Larvel-mix + Pinia throws an error: getActivePinia was called with no active Pinia - Stack Overflow")
* [setActivePinia](https://pinia.vuejs.org/api/modules/pinia.html#setActivePinia "Module: pinia | Pinia")


---

:::info
建立日期：2023-09-28
更新日期：2023-09-28
:::