簡體   English   中英

使用 Next.js 將新用戶添加到數據庫時出錯 | 棱鏡 | Heroku

[英]Error adding New User to database with Next.js | Prisma | Heroku

我正在開發我的第一個全棧應用程序項目以及在線課程。 經過數小時的故障排除后,我遇到了無法解決的障礙。 嘗試通過命令行將新用戶添加到 Postgres DB 時發生錯誤。

import bcrypt from 'bcrypt'
import jwt from 'jsonwebtoken'
import cookie from 'cookie'
import { NextApiRequest, NextApiResponse } from 'next'
import prisma from '../../lib/prisma'

export default async (req: NextApiRequest, res: NextApiResponse) => {
    const salt = bcrypt.genSaltSync()
    const { email, password } = req.body

    let user

    try {
        user = await prisma.user.create({
            data: {
            email,
            password: bcrypt.hashSync(password, salt),
        },
      })
    } catch (e) {
      res.status(401)
      res.json({ error: 'User already exists' })
      return
    }

    const token = jwt.sign(
    {
      email: user.email,
      id: user.id,
      time: Date.now(),
    },
      'hello',
      { expiresIn: '8h' }
    )

  res.setHeader(
    'Set-Cookie',
    cookie.serialize('TRAX_ACCESS_TOKEN', token, {
      httpOnly: true,
      maxAge: 8 * 60 * 60,
      path: '/',
      sameSite: 'lax',
      secure: process.env.NODE_ENV === 'production',
    })
  )

  res.json(user)
}

我正在嘗試通過 HTTPie 使用以下命令添加用戶:

http POST :3000/api/signup email=h@h.com password=abcabc

我在運行“prisma generate”后得到解決的數據屬性錯誤。

但是,我仍然收到一個錯誤:用戶已經存在。

我可以通過檢查用戶表中的 Prisma Studio 來驗證用戶不存在,並且沒有創建新用戶。

回復:

HTTP/1.1 401 Unauthorized
Connection: keep-alive
Content-Length: 31
Content-Type: application/json; charset=utf-8
Date: Sun, 05 Jun 2022 19:57:59 GMT
ETag: "1f-lFUySNKwX3L5eGEwGcNcUoVKWhE"
Keep-Alive: timeout=5
Vary: Accept-Encoding

{
    "error": "User already exists"
}

這是我的 schema.prisma 文件:

    // This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider          = "postgresql"
  url               = env("DATABASE_URL")
  shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
}

model User {
  id        Int        @id @default(autoincrement())
  createdAt DateTime   @default(now())
  updatedAt DateTime   @updatedAt
  email     String     @unique
  firstName String?
  lastName  String?
  password  String
  playlists Playlist[]
}

model Song {
  id        Int        @id @default(autoincrement())
  createdAt DateTime   @default(now())
  updatedAt DateTime   @updatedAt
  name      String
  artist    Artist     @relation(fields: [artistId], references: [id])
  artistId  Int
  playlists Playlist[]
  duration  Int
  url       String
}

model Artist {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  songs     Song[]
  name      String   @unique
}

model Playlist {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  name      String
  songs     Song[]
  user      User     @relation(fields: [userId], references: [id])
  userId    Int
}

我可以通過更新我的 middleware.ts 以包含前綴 ${origin} 來完成這項工作,如下所示:

import { NextResponse } from 'next/server'

const signedinPages = ['${origin}/', '${origin}/playlist', 
'${origin}/library']

export default function middleware(req) {
  if (signedinPages.find((p) => p === req.nextUrl.pathname)) {
    const token = req.cookies.MMA_ACCESS_TOKEN

    if (!token) {
      return NextResponse.redirect('${origin}/signin')
    }
  }
}

和我的 HTTPie 請求

http POST :3000/api/signup email=h@h.com password=abcabc firstName=Eric lastName=Bell

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM