我正在尝试向Next JS API路由发送HTTP POST请求。我正在使用Postman发送此请求。此POST请求试图将用户添加到我的Postgres数据库。但是,在保存数据之前,它会在所有字段上进行验证并检查以确保帐户不存在。如果帐户已经存在,则我会得到响应:
{
"response": "Your account already exists! Please sign in."
}
这是预期的行为。然而,如果帐户不存在,那么Postman只是不断地停留在加载屏幕上,我永远不会得到响应。我已经验证了这不是Postman的问题,因为我已经用Testfully测试过了。下面是我的代码:
import { PrismaClient } from "@prisma/client";
import { NextResponse } from "next/server";
import validator from "validator";
import bcrypt from "bcrypt";
import * as jose from "jose";
const prisma = new PrismaClient();
export async function POST(request: Request) {
const { firstName, lastName, email, phone, city, password } = await request.json();
const errors: string[] = [];
const validationSchema = [
{
valid: validator.isLength(firstName, {
min: 1,
max: 20,
}),
error: "Invalid first name.",
},
{
valid: validator.isLength(lastName, {
min: 1,
max: 20,
}),
error: "Invalid last name.",
},
{
valid: validator.isEmail(email),
error: "Invalid email.",
},
{
valid: validator.isMobilePhone(phone),
error: "Invalid phone number.",
},
{
valid: validator.isLength(city, {
min: 1,
max: 20,
}),
error: "Invalid city.",
},
{
valid: validator.isStrongPassword(password),
error: "Invalaid password.",
},
];
validationSchema.forEach((check) => {
if (!check.valid) {
errors.push(check.error);
}
});
if (errors.length) {
return NextResponse.json(errors[0]);
}
const userWithEmail = await prisma.user.findUnique({
where: {
email,
},
});
if (userWithEmail) {
return NextResponse.json({
response: "Your account already exists! Please sign in.",
});
}
const hash = await bcrypt.hash(password, 22);
const user = await prisma.user.create({
data: {
first_name: firstName,
last_name: lastName,
email: email,
phone: phone,
city: city,
password: hash,
},
});
const alg = "HS256";
const JWTSecret = new TextEncoder().encode(process.env.JWT_SECRET);
const token = await new jose.SignJWT({
email: user.email,
})
.setProtectedHeader({ alg })
.setExpirationTime("24h")
.sign(JWTSecret);
console.log(token);
return NextResponse.json({
JWT: token,
});
}
编辑:我运行了一堆console.log()```` tests to see where the code is failing and it happens right after
prisma create```。没有错误。
1条答案
按热度按时间mxg2im7a1#
从我所看到的测试中,问题在于你对密码的哈希。添加22个salt回合需要大量的时间。将其减少到10个允许服务器在73ms内响应。但是使用22个,需要很长的时间。即使使用15个回合,也需要2秒。Increasing the salt round by 1, doubles the cost.
我建议降低盐轮,或者使用另一种哈希方法。