docs/content/docs/reference/faq.mdx
This page contains frequently asked questions, common issues, and other helpful information about Better Auth.
<Accordions> <Accordion id="auth-client-not-working" title="Auth client not working"> When encountering `createAuthClient` related errors, make sure to have the correct import path as it varies based on environment.If you're using the auth client on react front-end, you'll need to import it from `/react`:
```ts title="component.ts"
import { createAuthClient } from "better-auth/react";
```
Where as if you're using the auth client in Next.js middleware, server-actions, server-components or anything server-related, you'll likely need to import it from `/client`:
```ts title="server.ts"
import { createAuthClient } from "better-auth/client";
```
```tsx title="server.tsx"
import { auth } from "./auth";
import { headers } from "next/headers";
const session = await auth.api.getSession({
headers: await headers()
})
```
if you need to use the auth client on the server for different purposes, you still can pass the request headers to it:
```tsx title="server.tsx"
import { authClient } from "./auth-client";
import { headers } from "next/headers";
const session = await authClient.getSession({
fetchOptions:{
headers: await headers()
}
})
```
```typescript title="auth.ts"
import { betterAuth } from "better-auth";
import { ProxyAgent, setGlobalDispatcher } from "undici";
const proxyAgent = new ProxyAgent("http://your-proxy.example.com:8080");
setGlobalDispatcher(proxyAgent);
export const auth = betterAuth({
// your configuration
});
```
Since Better Auth runs on the server side, you have full control over Node.js's fetch behavior through undici's global dispatcher. This approach allows all outbound requests from Better Auth to go through your corporate proxy.
<Callout type="info">
Learn more about undici ProxyAgent in the [undici documentation](https://github.com/nodejs/undici/blob/main/docs/docs/api/ProxyAgent.md).
</Callout>
`useSession` is a hook, meaning it can trigger re-renders whenever session data changes.
If you have UI you need to change based on user or session data, you can use this hook.
<Callout type="warn">
For performance reasons, do not use this hook on your `layout.tsx` file. We
recommend using RSC and use your server auth instance to get the session data
via `auth.api.getSession`.
</Callout>
`getSession` returns a promise containing data and error.
For all other situations where you shouldn't use `useSession`, is when you should be using `getSession`.
<Callout type="info">
`getSession` is available on both server and client auth instances.
Not just the latter.
</Callout>
```json title="tsconfig.json"
{
"compilerOptions": {
"strict": true,
}
}
```
if you can't set strict to true, you can enable strictNullChecks:
```json title="tsconfig.json"
{
"compilerOptions": {
"strictNullChecks": true,
}
}
```
You can learn more in our <Link href="/docs/concepts/typescript#typescript-config">TypeScript docs</Link>.
We do plan to have more customizability in the future in this regard, but for now, you can't remove these fields.
```
No request state found. Please make sure you are calling this function within a `runWithRequestState` callback.
```
This is typically caused by a **dual module hazard** - when multiple versions of `better-auth` or `@better-auth/core` exist in your dependency tree. This commonly occurs after upgrading to v1.4+, especially in Cloudflare Workers, Nuxt, or when using plugins like `oauthProvider`.
### How to Diagnose
Check if you have duplicate versions of Better Auth packages:
```bash
# For pnpm users
pnpm why @better-auth/core
pnpm why better-auth
# For npm users
npm ls @better-auth/core
npm ls better-auth
# For yarn users
yarn why @better-auth/core
yarn why better-auth
```
If you see multiple versions listed, you have a dual module hazard.
### How to Fix
#### Basic Steps
Start by ensuring your dependencies are clean and all Better Auth packages use compatible versions.
<Callout type="tip">
**Clean reinstall:**
```bash
# Remove node_modules and lockfile
rm -rf node_modules
rm pnpm-lock.yaml # or package-lock.json or yarn.lock
# Reinstall dependencies
pnpm install # or npm install or yarn install
```
Check your `package.json` and make sure all Better Auth related packages (`better-auth`, `@better-auth/core`, `@better-auth/oauth-provider`, etc.) are using compatible versions.
</Callout>
#### Package Manager Resolution Issues
If you're using Yarn v1 (Classic) or potentially other package managers like pnpm v9, you may need to force `better-call` to resolve to a single instance.
<Callout type="warn">
**For Yarn v1 / pnpm v9 users:**
Manually install `better-call` and add it to both `dependencies` and `resolutions` to force it to be hoisted to the top level:
```json title="package.json"
{
"dependencies": {
"better-call": "^1.1.8",
// ... other dependencies
},
"resolutions": {
"better-call": "^1.1.8"
}
}
```
Then reinstall your dependencies:
```bash
yarn install # or pnpm install
```
Note: Yarn v3 and pnpm v10 don't typically have this issue.
</Callout>
<Callout type="error">
**Important:** Make sure to install `better-auth` and related packages in `dependencies`, not `devDependencies`.
</Callout>
#### Bundler Resolution Issues
This is a bundler-level issue where the same module gets resolved to different instances. The goal is to make your bundler resolve the module to the same instance.
<Callout type="info">
**For Next.js users:**
Add `better-auth` to `serverExternalPackages` in your `next.config.js`:
```ts title="next.config.js"
const config = {
serverExternalPackages: ['better-auth']
};
```
</Callout>
<Callout type="info">
**For Cloudflare Workers users:**
Make sure you have the `nodejs_compat` compatibility flag enabled in your `wrangler.toml`:
```toml title="wrangler.toml"
compatibility_flags = ["nodejs_compat"]
```
</Callout>
#### Verify the Fix
Run the diagnostic commands again to confirm only one version of each package exists:
```bash
pnpm why @better-auth/core
pnpm why better-auth
pnpm why better-call
```
You should see only one version listed for each package.
<Callout type="info">
Related issues: [#6613](https://github.com/better-auth/better-auth/issues/6613), [yjs#438](https://github.com/yjs/yjs/issues/438)
</Callout>