内部服务器错误 500:Validator
我正在使用 AdonisJS 尝试使用 Inertia/Vue3 创建身份验证系统。
到目前为止,注册表一直有效,直到我将
rules.oneLowerCaseAtLeast()
添加到 UserValidators.ts
然后它会抛出错误。
状态代码:500 内部服务器错误
TypeError: Validator_1.rules.oneLowerCaseAtLeast 不是函数
这是堆栈错误
[21:40:20.895] ERROR (adonis-inertia-app/2500): Validator_1.rules.oneLowerCaseAtLeast is not a function
err: {
"type": "TypeError",
"message": "Validator_1.rules.oneLowerCaseAtLeast is not a function",
"stack":
TypeError: Validator_1.rules.oneLowerCaseAtLeast is not a function
at passwordRules (C:\Users\User\Projects\adonis-inertia-app\app\Validators\UserValidators.ts:17:11)
at new CreateUserValidator (C:\Users\User\Projects\adonis-inertia-app\app\Validators\UserValidators.ts:81:45)
at Request.validateRequest [as validate] (C:\Users\User\Projects\adonis-inertia-app\node_modules\@adonisjs\validator\build\src\Bindings\Request.js:22:65)
at SignupController.submitSignupForm (C:\Users\User\Projects\adonis-inertia-app\app\Controllers\Http\SignupController.ts:18:35)
at Injector.callAsync (C:\Users\User\Projects\adonis-inertia-app\node_modules\@adonisjs\fold\build\src\Ioc\Injector.js:124:30)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
"status": 500
}
控制器:
app\Controllers\Http\SignupController.ts
import { HttpContextContract } from "@ioc:Adonis/Core/HttpContext";
import { CreateUserValidator } from "App/Validators/UserValidators";
import UserService from "App/Services/UserService";
import User from "App/Models/User";
import VerificationProcedure from "App/Models/VerificationProcedure";
import starterConfig from "Config/starter";
export default class SignupController {
public async signupForm({ inertia }: HttpContextContract) {
return inertia.render('Register')
}
public async submitSignupForm({
request,
response,
session,
}: HttpContextContract) {
const payload = await request.validate(CreateUserValidator);
const user = await UserService.create(payload);
if (!starterConfig.signup.verifyEmail) {
session.flash({
notification: "Your account has been created. You can log in.",
});
response.redirect(`/`);
} else {
session.put("tmpUser", user);
response.redirect(`/signup/check-your-inbox`);
}
}
public async checkYourInbox({
view,
session,
response,
}: HttpContextContract) {
const user = session.get("tmpUser");
if (!user) {
return response.forbidden();
}
return view.render("pages/SignUpCheckYourInbox", {
user: session.get("tmpUser"),
});
}
public async verifyEmail({ view, params }: HttpContextContract) {
const verificationProcedure = await VerificationProcedure.findOrFail(
params.id
);
const user = await User.findOrFail(verificationProcedure.userId);
user.blocked = false;
user.emailVerified = true;
await user.save();
await verificationProcedure.delete();
return view.render("pages/verifyEmail", {});
}
}
验证者:
app\Validators\UserValidators.ts
import { schema, rules } from "@ioc:Adonis/Core/Validator";
import { HttpContextContract } from "@ioc:Adonis/Core/HttpContext";
import UserService from "App/Services/UserService";
const roleIds = UserService.allRolesExceptRoot().map((r) => r.id);
const PASSWORD_MIN_LENGTH = 1;
const PASSWORD_MAX_LENGTH = 255;
function emailRules() {
return [rules.maxLength(255), rules.minLength(5), rules.email()];
}
export function passwordRules(confirm = true) {
const passwordRules = [
rules.minLength(PASSWORD_MIN_LENGTH),
rules.maxLength(PASSWORD_MAX_LENGTH),
rules.oneLowerCaseAtLeast(),
// rules.oneNumericAtLeast(),
// rules.oneUpperCaseAtLeast(),
// rules.oneSpecialCharacterAtLeast(),
];
if (confirm) {
passwordRules.push(rules.confirmed("password_confirmation"));
}
return passwordRules;
}
// no rules for now, we just want passwordConfirmation field
// to be equal to password field, which is validated.
function passwordConfirmationRules() {
return [];
}
export class CreateUserValidator {
constructor(protected ctx: HttpContextContract) {}
public schema = schema.create({
name: schema.string({ trim: true }, nameRules()),
email: schema.string({ trim: true }, [
...emailRules(),
rules.unique({ table: "users", column: "email" }),
]),
password: schema.string({ trim: true }, passwordRules()),
password_confirmation: schema.string(
{ trim: true },
passwordConfirmationRules()
),
picture: schema.file.optional(pictureRules()),
});
public messages = customMessages();
}
合约:
app\contracts\validator.ts
declare module "@ioc:Adonis/Core/Validator" {
interface Rules {
oneLowerCaseAtLeast(): Rule;
oneUpperCaseAtLeast(): Rule;
oneNumericAtLeast(): Rule;
oneSpecialCharacterAtLeast(): Rule;
}
}
回答如下: