Prisma, следующий маршрут JS api prisma.create выдает мне неверный запрос

#javascript #reactjs #next.js #prisma

#javascript #reactjs #next.js #призма

Вопрос:

У меня есть следующая схема prisma

 // This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

generator client {
  provider = "prisma-client-js"
}

model FormInput {
  id    String @id @default(uuid())
  name  String
  type  String
  order String
}
 

и jsx реагирует на файл nextjs

 import Head from "next/head";
import styles from "../styles/Home.module.css";
import { PrismaClient } from "@prisma/client";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { v4 as cuid } from "uuid";
import styled from "styled-components";

const prisma = new PrismaClient();

const FormStyles = styled.form`
  display: grid;
  grid-template-columns: 350px 1fr;
  label {
    //background: red;
  }
  input,
  select {
    //background: aqua;
    border: 1px solid grey;
    border-top: 0;
    border-right: 0;
    border-left: 0;
  }
  input[type="button"] {
    background: green;
    border: none;
    border-radius: 30px;
    color: #fff;
    padding: 15px;
    width: 200px;
    margin: 0 0 25px auto;
    amp;:hover {
      cursor: pointer;
    }
  }
  button {
    background: lightgray;
    padding: 15px;
    border: none;
    amp;:hover {
      cursor: pointer;
    }
  }
`;

const GridStyles = styled.div`
  display: grid;
  grid-row-gap: 5px;
  padding: 15px 0;
  width: 600px;
  margin: 0 auto 0 0;
  div {
    display: grid;
    grid-template-columns: 100px 1fr;
    align-items: center;
  }
`;

export async function getServerSideProps() {
  const formInputs = await prisma.formInput.findMany();
  return {
    props: {
      initialFormInputs: formInputs,
    },
  };
}

export default function Home({ initialFormInputs }) {
  const blankFormInput = {
    name: "test",
    id: cuid(),
    type: "text",
  };
  const [formState, setFormState] = useState([blankFormInput]);

  const [inputs, setFormInputs] = useState(initialFormInputs);

  const test = inputs?.reduce((obj, item, idx) => {
    return { ...obj, [`name-${item.id}`]: item.name };
  }, {});

  const { register, handleSubmit, errors } = useForm({ defaultValues: test });

  const onSubmit = async (data) => {
    let hmm = formState.map((ok) => {
      var name = data[`name-${ok.id}`];
      var type = data[`type-${ok.id}`];
      var boogie = { [ok.id]: { name: name, type: type } };
      return boogie;
    });

    const response = await fetch("/api/formSave", {
      method: "POST",
      body: JSON.stringify(hmm),
    });

    if (!response.ok) {
      throw new Error(response.statusText);
    }
  };

  const addInput = async () => {
    const blanktext = {
      name: "Test",
      id: cuid(),
      type: "text",
      order: 0,
    };
    setFormState([...formState, { ...blanktext }]);
    const response = await fetch("/api/addInput", {
      method: "POST",
      body: JSON.stringify(blanktext),
    });

    if (!response.ok) {
      throw new Error(response.statusText);
    }

    console.log(response);
  };

  return (
    <>
      <FormStyles onSubmit={handleSubmit(onSubmit)}>
        <h1>Create Your Form Input Fields</h1>
        <div>
          {formState.map((val, idx) => {
            const nameId = `name-${val.id}`;
            const typeId = `type-${val.id}`;
            return (
              <div key={val.id}>
                {val.type === "text" amp;amp; (
                  <GridStyles>
                    <div>
                      <label htmlFor={nameId}>Input Name</label>

                      <input
                        type="text"
                        name={nameId}
                        id={nameId}
                        className={val.type}
                        ref={register()}
                      />
                    </div>
                    <div>
                      <label htmlFor={typeId}>Input Type</label>

                      <select name={typeId} ref={register}>
                        <option value="text">text</option>
                        <option value=" image"> image</option>
                      </select>
                    </div>
                  </GridStyles>
                )}
              </div>
            );
          })}
          <GridStyles>
            <input type="button" value="Add Form Input" onClick={addInput} />
            <button type="submit">Save Form</button>
          </GridStyles>
        </div>
      </FormStyles>
    </>
  );
}
 

Я отправляю следующий объект на этот маршрут api

 {
  name: 'Test',
  id: 'e5b85d84-f21c-4e71-9921-98eb2cdedb3a',
  type: 'text',
  order: 0
}
 

маршрут api

 import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

export default async (req, res) => {
  if (req.method !== "POST") {
    return res.status(405).json({ message: "Method not allowed" });
  }

  try {
    const input = JSON.parse(req.body);
    console.log(input);
    const savedContact = await prisma.formInput.create({ data: input });
    res.status(200).json({ message: "hello" });
  } catch (err) {
    res.status(400).json({ message: "Something went wrong" });
  }
};
 

Я продолжаю получать плохие запросы, я пробовал в разной степени prisma.formInputCreate и другие. Это происходит, когда я нажимаю кнопку добавления ввода. Я ожидаю, что он добавит строку в базу данных. Спасибо за любую помощь

Комментарии:

1. Не могли бы вы поделиться ошибкой, которую вы получаете при catch регистрации err ?

2. Я зарегистрировал ошибку, и она просто сказала, что неверный запрос

3. Я попытался зарегистрировать переменную prisma.FormInput.create на стороне api, чтобы посмотреть, смогу ли я получить результат в консоли терминала, и он ничего не показывает. Должно быть, я делаю что-то не так

4. Я попытался ввести .catch и войти в систему prisma.formInput.create().catch((err)=>console.log(err)) , но без кубиков, разве это не место для его размещения

5. Одним из способов отладки была бы проверка правильности передаваемых вами данных await prisma.formInput.create() или нет. Также попробуйте запустить метод create отдельно и проверить. Если это работает, то, скорее всего, это проблема ввода или API.