Я слежу за видео на YouTube от JS Mastery об их приложении HealthCare с использованием Next.js и Appwrite. Я получил ключи API из облака Appwrite и добавил их в файл .env.local. Но когда я запускаю свой проект, я получаю следующую ошибку:
TypeError: Failed to construct 'URL': Invalid URL
at Users.create (users.mjs:77:17)
at createUser (patient.actions.ts:6:37)
at onSubmit (PatientForm.tsx:43:42)
at eval (index.esm.mjs:2256:23)
Код создания пользователя выглядит так:
import { ID, Query } from "node-appwrite"
import { users } from "../appwrite.config"
export const createUser = async (user: CreateUserParams) => {
try {
const newUser = await users.create(
ID.unique(),
user.email,
user.phone,
undefined,
user.name
)
console.info(newUser)
} catch(error: any) {
if (error && error?.code === 409) {
const documents = await users.list([
Query.equal('email', [user.email])
])
return documents?.users[0]
} else {
console.info(error)
}
}
}
и пользователь подвергается воздействию этого кода,
import * as sdk from "node-appwrite";
export const {
NEXT_PUBLIC_ENDPOINT: ENDPOINT,
PROJECT_ID,
API_KEY,
DATABASE_ID,
PATIENT_COLLECTION_ID,
DOCTOR_COLLECTION_ID,
APPOINTMENT_COLLECTION_ID,
NEXT_PUBLIC_BUCKET_ID: BUCKET_ID,
} = process.env;
const client = new sdk.Client();
client.setEndpoint(ENDPOINT!).setProject(PROJECT_ID!).setKey(API_KEY!);
export const databases = new sdk.Databases(client);
export const users = new sdk.Users(client);
export const messaging = new sdk.Messaging(client);
export const storage = new sdk.Storage(client);
файл .env.local,
PROJECT_ID=************
API_KEY=************************************
DATABASE_ID=************
PATIENT_COLLECTION_ID=************
DOCTOR_COLLECTION_ID=************
APPOINTMENT_COLLECTION_ID=************
NEXT_PUBLIC_BUCKET_ID=************
NEXT_PUBLIC_ENDPOINT=https://cloud.appwrite.io/v1
Я дважды проверил значения API, и они такие, какими и должны быть. Чтобы проверить, неверны ли значения, я попытался заменить имена переменных фактическими значениями .env, и это работает нормально.
client
.setEndpoint("https://cloud.appwrite.io/v1")
.setProject("***************")
.setKey("*****************);
Есть ли что-то, что мне не хватает? Пожалуйста, дайте мне знать, как решить эту проблему. Любая помощь приветствуется. Спасибо.
Однако у меня нет файла users.mjs
. Единственные места, которые ссылаются на пользователей, — это файл appwrite.config и файл функции createUser.
Связанный вопрос о переменных среды: stackoverflow.com/q/62386582/14072498 Пожалуйста, прочитайте комментарии к ответу с самым высоким рейтингом и посмотрите на ответ, занимающий второе место по рейтингу.
Я тоже прочитал вопрос и ответы, как вы упомянули, к сожалению, они не помогают. Я могу получить доступ к переменным на сервере, и создание пользователя происходит на сервере. Однако представление их как переменных env каким-то образом вызывает ошибку типа. Это проблема, с которой я столкнулся
это сработало для меня; обновите следующую конфигурацию до этой
/** @type {import('next').NextConfig} */
const nextConfig = {
env: {
PROJECT_ID: process.env.PROJECT_ID,
API_KEY:process.env.API_KEY,
DATABASE_ID:process.env.DATABASE_ID,
PATIENT_COLLECTION_ID:process.env.PATIENT_COLLECTION_ID,
DOCTOR_COLLECTION_ID:process.env.DOCTOR_COLLECTION_ID,
APPOINTMENT_COLLECTION_ID:process.env.APPOINTMENT_COLLECTION_ID,
BUCKET_ID:process.env.BUCKET_ID,
ENDPOINT:process.env.ENDPOINT
}
};
export default nextConfig;
К сожалению, это не работает для меня. Я изменил конфигурацию и перезапустил сервер, но он по-прежнему не работает, как и раньше.
Я так долго застрял на этом. Добавьте это в начало пациентов.actions.ts:
"use server"
Большое спасибо, это работает. Спасибо @Krishnadev. V Теперь я знаю, почему это работает. Хотя странно, что в видео об этом не упомянуто.
добавьте "use server"
поверх patients.actions.ts
файла. Добавляя «использовать сервер», вы сообщаете Next.js, что все функции в этом файле должны выполняться на сервере, а не на клиенте. Серверный код может получить доступ ко всем переменным среды, включая те, у которых нет префикса NEXT_PUBLIC_.
. Вот почему ваши PROJECT_ID
, API_KEY
и DATABASE_ID
стали доступными.
"use server"
import { ID, Query } from "node-appwrite";
import { users } from "../appwrite.config";
export const createUser = async (user: CreateUserParams) => {
try {
const newuser = await users.create(
ID.unique(),
user.email,
user.phone,
undefined,
user.name
);
} catch (error: any) {
if (error && error?.code === 409) {
const documents = await users.list([Query.equal("email", [user.email])]);
return documents?.users[0];
}
console.error("An error occurred while creating a new user:", error);
}
};
Эта часть ошибки
at Users.create (users.mjs:77:17)
указывает на то, что вам следует добавить в свой вопрос код внутри файлаusers.mjs. БР