因此,當我訪問 SvelteKit 發布端點時,如果我提交一些值并且它們沒有通過驗證檢查,它就可以正常作業。它回傳正確的狀態和正文。但是,當它插入資料庫時??,端點回傳 404 錯誤,但它會將用戶插入資料庫中。我認為這是因為 DB 呼叫是異步的并且 SvelteKit 沒有等待結果回傳,但不確定如何更改我的代碼,以便它等待并發送正確的 json 回應。
謝謝你的幫助!
import type { EndpointOutput } from '@sveltejs/kit';
import bcrypt from 'bcrypt';
import { randomUUID } from 'crypto';
import db from '$lib/config/db.js';
import { roles } from '$lib/config/roles.js';
import validation from '$lib/_helpers/validation';
export async function post({
body
}: {
body: { firstName: string; lastName: string; emailAddress: string; password: string };
}): Promise<EndpointOutput> {
//lets trim any whitespace on the fields
console.log(body);
const firstName = body?.firstName.trim();
const lastName = body?.lastName.trim();
const email = body?.emailAddress.trim();
const password = body?.password.trim();
const userRole = roles.web roles.anonymous;
const bcryptPassword = await bcrypt.hash(password, 10);
const emailToken = randomUUID();
// double check the validation on the fields in case user submits directly to this endpoint.
if (validation.validateEmail(email) == false) {
//console.log(email);
return {
status: 422,
body: {
message: 'Please enter a valid email address.'
}
};
}
if (validation.validatePassword(password) == false) {
return {
status: 422,
body: {
message: 'Password must be at least 6 characters.'
}
};
}
if (validation.validateNotEmpty(firstName) == false) {
return {
status: 422,
body: {
message: 'First Name is required.'
}
};
}
if (validation.validateDisplayName(lastName) == false) {
return {
status: 422,
body: {
message: 'Last Name is required.'
}
};
}
//insert user
await db.query(
'INSERT INTO users (first_name, last_name, email, user_password, user_role, email_verification_token) VALUES ($1, $2, $3, $4, $5, $6)',
[firstName, lastName, email, bcryptPassword, userRole, emailToken],
(error, results) => {
// console.log(error, results);
if (error) {
return {
status: 417,
body: {
message: error.toString()
}
};
}
//console.log(results);
return {
status: 201,
body: {
message: 'User created successfully'
}
};
}
);
}
更新修復
我最終使用 pg-promise 包而不是 pg 包來連接我的資料庫。
以下是更新后的代碼,以防有人遇到類似問題。
import type { EndpointOutput } from '@sveltejs/kit';
import bcrypt from 'bcrypt';
import { randomUUID } from 'crypto';
import { roles } from '$lib/config/roles.js';
import validation from '$lib/_helpers/validation';
import { db } from '$lib/config/db.js';
export async function post({
body
}: {
body: { firstName: string; lastName: string; emailAddress: string; password: string };
}): Promise<EndpointOutput> {
//lets trim any whitespace on the fields
console.log(body);
const firstName = body?.firstName.trim();
const lastName = body?.lastName.trim();
const email = body?.emailAddress.trim();
const password = body?.password.trim();
const userRole = roles.web roles.anonymous;
const bcryptPassword = await bcrypt.hash(password, 10);
const emailToken = randomUUID();
// double check the validation on the fields in case user submits directly to this endpoint.
if (validation.validateEmail(email) == false) {
//console.log(email);
return {
status: 422,
body: {
message: 'Please enter a valid email address.'
}
};
}
if (validation.validatePassword(password) == false) {
return {
status: 422,
body: {
message: 'Password must be at least 6 characters.'
}
};
}
if (validation.validateNotEmpty(firstName) == false) {
return {
status: 422,
body: {
message: 'First Name is required.'
}
};
}
if (validation.validateDisplayName(lastName) == false) {
return {
status: 422,
body: {
message: 'Last Name is required.'
}
};
}
//check if user already exists.
const userAlreadyExists = await db.oneOrNone('SELECT email from users WHERE email=$1 LIMIT 1', [
email
]);
console.log(' result: ' userAlreadyExists);
if (userAlreadyExists) {
return {
status: 409,
body: {
message: 'User with that email already exists'
}
};
}
try {
// insert New user into DB
await db.none(
'INSERT INTO users (first_name, last_name, email, user_password, user_role, email_verification_token) VALUES ($1, $2, $3, $4, $5, $6)',
[firstName, lastName, email, bcryptPassword, userRole, emailToken]
);
return {
status: 201,
body: {
message: 'User created successfully'
}
};
} catch (error) {
return {
status: 417,
body: {
message: error.toString()
}
};
}
}
uj5u.com熱心網友回復:
您的問題是您使用的資料庫是通過回呼系統實作的function query(queryString, callback),您await不需要等待它,return回呼中的實際上也不是端點的回傳。
最好的辦法是檢查您的資料庫庫是否具有異步方法,您可以在其中執行類似或類似的操作:
const { errror, result } = await db.query(....)
這樣,應用程式實際上將等待查詢完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/346946.html
標籤:打字稿 PostgreSQL 苗条的
上一篇:以編程方式運行SQL腳本
