Приложение Next.js пишет «TypeError: не удалось создать URL-адрес», но работает, если указано напрямую

Я слежу за видео на 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("*****************);

Есть ли что-то, что мне не хватает? Пожалуйста, дайте мне знать, как решить эту проблему. Любая помощь приветствуется. Спасибо.

Ссылка на видео на YouTube

Эта часть ошибки at Users.create (users.mjs:77:17) указывает на то, что вам следует добавить в свой вопрос код внутри файлаusers.mjs. БР

Roar S. 14.07.2024 12:50

Однако у меня нет файла users.mjs. Единственные места, которые ссылаются на пользователей, — это файл appwrite.config и файл функции createUser.

Kavin Bharathi 14.07.2024 13:03

Связанный вопрос о переменных среды: stackoverflow.com/q/62386582/14072498 Пожалуйста, прочитайте комментарии к ответу с самым высоким рейтингом и посмотрите на ответ, занимающий второе место по рейтингу.

Roar S. 14.07.2024 13:47

Я тоже прочитал вопрос и ответы, как вы упомянули, к сожалению, они не помогают. Я могу получить доступ к переменным на сервере, и создание пользователя происходит на сервере. Однако представление их как переменных env каким-то образом вызывает ошибку типа. Это проблема, с которой я столкнулся

Kavin Bharathi 14.07.2024 14:56
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
4
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

это сработало для меня; обновите следующую конфигурацию до этой

/** @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;

К сожалению, это не работает для меня. Я изменил конфигурацию и перезапустил сервер, но он по-прежнему не работает, как и раньше.

Kavin Bharathi 15.07.2024 11:01

Я так долго застрял на этом. Добавьте это в начало пациентов.actions.ts:

"use server"

Большое спасибо, это работает. Спасибо @Krishnadev. V Теперь я знаю, почему это работает. Хотя странно, что в видео об этом не упомянуто.

Kavin Bharathi 21.07.2024 21:14
Ответ принят как подходящий

добавьте "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);
      }
    };

Другие вопросы по теме