SurrealDB Adapter
리소스
설정
설치
npm install @auth/surrealdb-adapter surrealdb.js
환경 변수
AUTH_SURREALDB_CONNECTION
AUTH_SURREALDB_USERNAME
AUTH_SURREALDB_PASSWORD
AUTH_SURREALDB_NS
AUTH_SURREALDB_DB
설정
./auth.ts
import NextAuth from "next-auth"
import { SurrealDBAdapter } from "@auth/surrealdb-adapter"
import clientPromise from "./lib/surrealdb"
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: [],
adapter: SurrealDBAdapter(clientPromise),
})
SurrealDB 어댑터는 자동으로 연결을 처리하지 않기 때문에, 어댑터에 이미 연결된 SurrealDBClient
를 전달해야 합니다. 아래 예제에서 이를 어떻게 하는지 확인할 수 있습니다.
Authorization
옵션 1 – RPC 사용:
./lib/surrealdb.ts
import { Surreal } from "surrealdb.js"
const connectionString = process.env.AUTH_SURREALDB_CONNECTION
const username = process.env.AUTH_SURREALDB_USERNAME
const password = process.env.AUTH_SURREALDB_PASSWORD
const namespace = process.env.AUTH_SURREALDB_NAMESPACE
const database = process.env.AUTH_SURREALDB_DATABASE
if (!connectionString || !username || !password || !namespace || !database) {
throw new Error(
"SurrealDB 연결 문자열, 사용자 이름, 비밀번호, 네임스페이스, 데이터베이스가 필요합니다"
)
}
const clientPromise = new Promise<Surreal>(async (resolve, reject) => {
const db = new Surreal()
try {
await db.connect(`${connectionString}/rpc`, {
namespace,
database,
auth: {
username,
password,
},
})
resolve(db)
} catch (e) {
reject(e)
}
})
// 모듈 범위의 Promise<Surreal>을 내보냅니다. 이를 별도의 모듈에서 수행함으로써
// 클라이언트를 여러 함수에서 공유할 수 있습니다.
export default clientPromise
옵션 2 – HTTP 사용:
Vercel과 같은 서버리스 환경에서 유용합니다.
./lib/surrealdb.ts
import { ExperimentalSurrealHTTP } from "surrealdb.js"
const connectionString = process.env.AUTH_SURREALDB_CONNECTION
const username = process.env.AUTH_SURREALDB_USERNAME
const password = process.env.AUTH_SURREALDB_PASSWORD
const namespace = process.env.AUTH_SURREALDB_NAMESPACE
const database = process.env.AUTH_SURREALDB_DATABASE
if (!connectionString || !username || !password || !namespace || !database) {
throw new Error(
"SurrealDB 연결 문자열, 사용자 이름, 비밀번호, 네임스페이스, 데이터베이스가 필요합니다"
)
}
const clientPromise = new Promise<ExperimentalSurrealHTTP<typeof fetch>>(
async (resolve, reject) => {
try {
const db = new ExperimentalSurrealHTTP(connectionString, {
fetch,
namespace,
database,
auth: {
username,
password,
},
})
resolve(db)
} catch (e) {
reject(e)
}
}
)
// 모듈 범위의 Promise<Surreal>을 내보냅니다. 이를 별도의 모듈에서 수행함으로써
// 클라이언트를 여러 함수에서 공유할 수 있습니다.
export default clientPromise