NextJS Dashboard 应用程序用户 API 身份验证

问题描述 投票:0回答:1

我正在尝试完成这个教程,但是,我不想通过 PostgreSQL 请求获取数据,而是想使用 API。

我使用await调用异步函数,但是,它首先返回一个未定义的值,然后,当API响应时,返回用户。 我只想返回用户一次,以使身份验证正常工作。

这是我的代码:

import Credentials from 'next-auth/providers/credentials';
import NextAuth from 'next-auth';
import type { User } from '@/app/lib/definitions';
import { authConfig } from './auth.config';
import { z } from 'zod';

async function getUser(email: string, password: string): Promise<User | undefined> {
  const axios = require('axios');
  axios
    .post(`http://localhost:4000/v1/auth/`, {email, password})
    .then((response: { data: any; }) => {
      console.log("response.data.user:", response.data.user);
      const userAuthenticated: User = {
        id: response.data.user.id,
        name: response.data.user.first_name + ' ' + response.data.user.last_name,
        email: response.data.user.email,
        password: ''
      };
      console.log("return userAuthenticated", userAuthenticated);
      return userAuthenticated;
    })
    .catch((error: { response: { data: { error: any; }; }; }) => {
      console.log("error:", error.response/*.data.error*/);
    })
    console.log("end of getUser");
}
 
export const { auth, signIn, signOut } = NextAuth({
  ...authConfig,
  providers: [
    Credentials({
      async authorize(credentials) {
        const parsedCredentials = z
          .object({ email: z.string().email(), password: z.string().min(6) })
          .safeParse(credentials);
 
        if (parsedCredentials.success) {
          const { email, password } = parsedCredentials.data;
          const user = await getUser(email, password);
          console.log('await getUser:', user);
          if (!user) {
            console.log('no user');
            return null;
          } else {
            console.log('user:', user);
            return user;
          }
        }
 
        return null;
      },
    }),
  ],
});

我的日志中有什么:

end of getUser
await getUser: undefined
no user
[auth][error] CredentialsSignin: Read more at https://errors.authjs.dev#credentialssignin
    at Module.callback (webpack-internal:///(action-browser)/./node_modules/@auth/core/lib/actions/callback/index.js:263:30)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async AuthInternal (webpack-internal:///(action-browser)/./node_modules/@auth/core/lib/index.js:67:24)
    at async Auth (webpack-internal:///(action-browser)/./node_modules/@auth/core/index.js:126:34)
    at async signIn (webpack-internal:///(action-browser)/./node_modules/next-auth/lib/actions.js:57:17)
    at async authenticate (webpack-internal:///(action-browser)/./app/lib/actions.ts:107:9)
    at async /Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/compiled/next-server/app-page.runtime.dev.js:38:489
    at async tX (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/compiled/next-server/app-page.runtime.dev.js:37:5207)
    at async rl (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/compiled/next-server/app-page.runtime.dev.js:38:22994)
    at async doRender (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/base-server.js:1407:30)
    at async cacheEntry.responseCache.get.routeKind (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/base-server.js:1571:28)
    at async DevServer.renderToResponseWithComponentsImpl (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/base-server.js:1479:28)
    at async DevServer.renderPageComponent (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/base-server.js:1850:24)
    at async DevServer.renderToResponseImpl (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/base-server.js:1888:32)
    at async DevServer.pipeImpl (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/base-server.js:902:25)
    at async NextNodeServer.handleCatchallRenderRequest (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/next-server.js:266:17)
    at async DevServer.handleRequestImpl (/Users/adrien/Dev/iothings/pam-front/node_modules/next/dist/server/base-server.js:798:17)
response.data.user: {
  id: '6621ff2bc4d8d576d3cb6eae',
  first_name: 'Adrien',
  last_name: 'Chapelet',
  email: '[email protected]',
}
return userAuthenticated {
  id: '6621ff2bc4d8d576d3cb6eae',
  name: 'Adrien Chapelet',
  email: '[email protected]',
  password: ''
}
reactjs typescript authentication next.js async-await
1个回答
0
投票

我注意到您尚未在

await
函数内编辑
axios.post
请求。这会导致函数在 axios Promise 解决之前退出。这会导致返回
getUser
而不是用户对象。
undefined

© www.soinside.com 2019 - 2024. All rights reserved.