应用程序错误:已发生客户端异常(有关更多信息,请参见浏览器控制台)。

发布于 2025-02-11 05:29:32 字数 3816 浏览 1 评论 0原文

在我的EXTJS应用程序中,授权在本地主机上有效,但是页面服务器给出了一个错误:应用程序错误:客户端异常发生(有关更多信息,请参见浏览器控制台)。他们需要登录,将密码保存到数据库中,当登录时,将成功执行通过Axios保护的页面重定向,并且那里存在错误。 库克的语言环境可以正确保存,但显然无法从那里计数。

我在请求中添加了一个标题(access-control-allow-origin),这无济于事。

我的服务:

import axios, {AxiosError} from "axios";
import { Router, useRouter } from "next/router";
import { useQuery } from "react-query";

const host = process.env.HOST || 'http://localhost:3000'
// axios instance
export const apiClient = axios.create({
    baseURL: host + "/api",
    withCredentials: true,
    headers: {
        "Content-type": "application/json"
    },
});

export type Admin = {
    id: string
    login: string
}
export type RedirectError = {
    redirectUrl: string
}

export const getSession = async () => {
    const response = await apiClient.get<Admin>('getSession')
    return response.data
}

export const useSession = () => {
    const router = useRouter()
    const { isLoading, error, data, isSuccess } = useQuery<Admin, AxiosError<RedirectError>>('sid', getSession)
    if (error) router.push(error.response.data.redirectUrl)
    return { isLoading, error, data, isSuccess }
}

我的API/Getession:

import type { NextApiRequest, NextApiResponse } from 'next'
import checkSession from '../../src/services/checkCookie'

export default async function getSession(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === 'GET') {
    try {
      const sid = req.cookies['sid']
      const admin = await checkSession(sid)
      if (admin) {
        const { id, login } = admin.admin
        return res.send({ id, login })
      }
      const host = process.env.NODE_ENV === 'production' ? process.env.HOST : 'http://localhost:3000'
      return res.status(401).send({ redirectUrl: host + '/admin/login' })
    } catch (error) {
      console.error(error)
      res.status(500).send({ message: "" })
    }
  } else {
    res.status(404).send({ message: "" })
  }
}

Getsession API中的校验:

export default async function   checkSession (token: string) {
    // const token = req.cookies['sid']
    if (typeof window === 'undefined' && token) {
        const unsign = (await import('./signature')).unsign
        const sessionToken = unsign(token, process.env.SECRET!)

        if (sessionToken && typeof sessionToken === 'string') {
            const db = (await import('../../prisma')).default
            const session = await db.session.findUnique({ where: { sessionToken }, 
                include: { admin: true } })
            if (session) {
                return { admin: session.admin }
            }
        }
    }
}

带有Axios的页面

import { NextPage } from "next"
import TableService  from "../src/component/TableService"
import AdminLayout from "../src/component/admin/AdminLayout"
import { Admin, getSession, RedirectError, useSession } from "../src/services/apiClient"
import { useRouter } from "next/router"
import { CircularProgress } from "@mui/material"

const  AdminTable: NextPage = () => {
  const router = useRouter()

  const {isLoading, error, data, isSuccess } = useSession()
    if (isLoading) return <CircularProgress />
    return (
      <>
      {data && <div>{data.login}</div>} 
      {isSuccess &&
        <AdminLayout title="">
          <TableService />
        </AdminLayout>
      }
      {isLoading && <p>Loading..</p>}
      {error && <p>Error occurred!</p>}
      </>
    )
  }
  
  export default AdminTable

In my extjs application , authorization works on the local host , but the page server gives an error : Application error: a client-side exception has occurred (see the browser console for more information) . They want a login, password are saved to the database, when logging in, a redirect to a page protected via axios is successfully performed, and there is an error there.
The cook's locale is saved correctly, but apparently cannot be counted from there.
enter image description here

I added a header (Access-Control-Allow-Origin) to the request, it didn't help.

My service :

import axios, {AxiosError} from "axios";
import { Router, useRouter } from "next/router";
import { useQuery } from "react-query";

const host = process.env.HOST || 'http://localhost:3000'
// axios instance
export const apiClient = axios.create({
    baseURL: host + "/api",
    withCredentials: true,
    headers: {
        "Content-type": "application/json"
    },
});

export type Admin = {
    id: string
    login: string
}
export type RedirectError = {
    redirectUrl: string
}

export const getSession = async () => {
    const response = await apiClient.get<Admin>('getSession')
    return response.data
}

export const useSession = () => {
    const router = useRouter()
    const { isLoading, error, data, isSuccess } = useQuery<Admin, AxiosError<RedirectError>>('sid', getSession)
    if (error) router.push(error.response.data.redirectUrl)
    return { isLoading, error, data, isSuccess }
}

My api/getSession:

import type { NextApiRequest, NextApiResponse } from 'next'
import checkSession from '../../src/services/checkCookie'

export default async function getSession(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === 'GET') {
    try {
      const sid = req.cookies['sid']
      const admin = await checkSession(sid)
      if (admin) {
        const { id, login } = admin.admin
        return res.send({ id, login })
      }
      const host = process.env.NODE_ENV === 'production' ? process.env.HOST : 'http://localhost:3000'
      return res.status(401).send({ redirectUrl: host + '/admin/login' })
    } catch (error) {
      console.error(error)
      res.status(500).send({ message: "" })
    }
  } else {
    res.status(404).send({ message: "" })
  }
}

checkSession in getSession api :

export default async function   checkSession (token: string) {
    // const token = req.cookies['sid']
    if (typeof window === 'undefined' && token) {
        const unsign = (await import('./signature')).unsign
        const sessionToken = unsign(token, process.env.SECRET!)

        if (sessionToken && typeof sessionToken === 'string') {
            const db = (await import('../../prisma')).default
            const session = await db.session.findUnique({ where: { sessionToken }, 
                include: { admin: true } })
            if (session) {
                return { admin: session.admin }
            }
        }
    }
}

Page with axios

import { NextPage } from "next"
import TableService  from "../src/component/TableService"
import AdminLayout from "../src/component/admin/AdminLayout"
import { Admin, getSession, RedirectError, useSession } from "../src/services/apiClient"
import { useRouter } from "next/router"
import { CircularProgress } from "@mui/material"

const  AdminTable: NextPage = () => {
  const router = useRouter()

  const {isLoading, error, data, isSuccess } = useSession()
    if (isLoading) return <CircularProgress />
    return (
      <>
      {data && <div>{data.login}</div>} 
      {isSuccess &&
        <AdminLayout title="">
          <TableService />
        </AdminLayout>
      }
      {isLoading && <p>Loading..</p>}
      {error && <p>Error occurred!</p>}
      </>
    )
  }
  
  export default AdminTable

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文