У меня есть интерфейс React с серверной частью Prisma (на основе Express) Node.js.

Я могу отправить запрос через почтальона (тип контента: x-www-form-urlencoded). Однако, когда я пытаюсь опубликовать через свой интерфейс, я не могу заставить свой объект тела содержать какие-либо данные.

Моя пост-функция React Axios:

async function acceptCreateTask() {
const createTaskFormData = new FormData();

createTaskFormData.append("title", formValue.title);
createTaskFormData.append("category", formValue.category);
createTaskFormData.append("discription", formValue.discription);

try {
  const response = await axios({
    method: "post",
    url: "http://localhost:3001/task",
    data: createTaskFormData,
    headers: { "content-type": "application/x-www-form-urlencoded" },
  }).then((res) => {
    //
  });
} catch (error) {
       //
   }  
}

Функция Призма Экспресс

const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();

var cors = require("cors");
var express = require("express");
var app = express();

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

//create a task
app.post("/task", async (req, res) => {
  console.log(req.body);

  const taskTitle = req.body.title;
  const taskCategory = req.body.category;
  const taskDiscription = req.body.discription;

  if (!req.body || !taskTitle || !taskCategory || !taskDiscription) {
    return res
      .status(400)
      .json({ message: "Title, categoy or discription is missing" });
  }

  try {
    const message = "Task created successfully";

    await prisma.task.create({
      data: {
        title: taskTitle,
        category: taskCategory,
        discription: taskDiscription,
      },
    });
    return res.json({ message });
  } catch (e) {
    return res.status(500).json({ message: "something went wrong" });
  }
});
0
Craws 27 Сен 2022 в 21:57

1 ответ

Вы отправляете данные формы. Вы должны использовать URLSearchParams для отправки URL- закодированные данные.

Вот пример использования зеркального API, который просто отражает отправленный запрос. Обратите внимание на раздел Body.

(async () => {
  const response = await fetch('https://apichallenges.herokuapp.com/mirror/request', {
    method: 'POST',
    body: new URLSearchParams({
      'userName': 'test@gmail.com',
      'password': 'Password!',
      'grant_type': 'password'
    })
  });
  console.log(`HTTP status code: ${response.status}`);
  console.log(await response.text());
 })();
/* StackOverflow snippet: console should overlap rendered HTML area */
.as-console-wrapper { max-height: 100% !important; top: 0; }

Между прочим: всегда полезно проверить код состояния HTTP на наличие таких ошибок, так как это даст представление о том, что пошло не так.

0
Mushroomator 27 Сен 2022 в 22:11