[英]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.