RRRaaa
@RRRaaa (R R)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Strapiへデータの更新ができないです。

解決したいこと

RemixからStrapiへデータを更新できるようにしたいです。
StrapiのコンテンツタイプにあるデータのuserAge(Integer), userName(text)を更新しようとしています。

発生している問題・エラー

データを更新しようをすると、以下のエラーがでてきます。

{"data":null,"error":{"status":404,"name":"NotFoundError","message":"Not Found","details":{}}}

また、以下のように、Strapiの管理画面と取得したものとのidが異なるのも気になります。
こういうものなのでしょうか。
スクリーンショット 2024-09-22 124040.png
スクリーンショット 2024-09-22 124221.png

該当するソースコード

import { json, LoaderFunction, ActionFunction } from "@remix-run/node";
import { useLoaderData, useFetcher } from "@remix-run/react";
import "./styles/updateUser.css";

interface StrPractice {
  id: number;
  documentId: string;
  userAge: number;
  userName: string;
  createdAt: string;
  updatedAt: string;
  publishedAt: string;
  locale: string | null;
}

interface ApiResponse {
  data: StrPractice[];
}

interface ApiMessage {
    success: boolean;
    message?: string;
}

export const loader: LoaderFunction = async () => {
  const apiUrl = `${process.env.STRAPI_URL_BASE}/api/str-practices`;
  const response = await fetch(apiUrl, {
    headers: {
      Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}`,
    },
  });

  if (!response.ok) {
    return json<ApiMessage>({ success: false, message: "Failed to fetch data from Strapi" }, { status: response.status });
  }

  const data: ApiResponse = await response.json();
  return json(data);
};


export const action: ActionFunction = async ({ request }) => {
  const formData = await request.formData();
  const userId = formData.get("userId");
  const userName = formData.get("userName");
  const userAge = formData.get("userAge");

  const apiUrl = `${process.env.STRAPI_URL_BASE}/api/str-practices/${userId}`;
  console.log("API URL:", apiUrl);  
  const response = await fetch(apiUrl, {
    method: "PUT",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}`,
    },
    body: JSON.stringify({
      data: [{
        userName,
        userAge: parseInt(userAge as string, 10),
      }],
    }),
  });

  const responseBody = await response.json();
  console.log("Strapi response:", responseBody);

  if (!response.ok) {
    return json<ApiMessage>({ success: false, message: responseBody.message || "Failed to update data in Strapi" }, { status: response.status });
  }

  return json<ApiMessage>({ success: true, message: "User updated successfully!" });
};


export default function UpdateUser() {
  const { data } = useLoaderData<ApiResponse>();
  const fetcher = useFetcher<ApiMessage>();

  return (
    <div>
      <h1>User List</h1>
      <ul>
        {data.map((user: StrPractice) => (
          <fetcher.Form method="post" key={user.id}>
            <p>Id: {user.id}</p>
            <input type="number" name="userId" value={user.id}/>
            <label>
              Name:
              <input className="uu_input" type="text" name="userName" defaultValue={user.userName}/>
            </label>
            <label>
              Age:
              <input className="uu_input" type="number" name="userAge" defaultValue={user.userAge}/>
            </label>
            <button className="uu_btn" type="submit">Update</button>
          </fetcher.Form>
        ))}
      </ul>
      {fetcher.data?.success && <p>{fetcher.data.message}</p>}
      {fetcher.data && !fetcher.data.success && <p>Error: {fetcher.data.message}</p>}
    </div>
  );
}

自分で試したこと

以下のようにid部分を1,2,3,4でそれぞれ試しましたが同様のエラーでダメでした。

curl -X GET http://127.0.0.1:1337/api/str-practices/2 -H "Authorization: Bearer YOUR_API_TOKEN"

URLへの直接アクセスも同様エラーです。
http://127.0.0.1:1337/api/str-practices/2

↓これならアクセスできて、以下が返ってきます。
http://127.0.0.1:1337/api/str-practices

{"data":[{"id":2,"documentId":"xfmmnvfbhd7f88abt5jiokks","userAge":11,"userName":"wanwan","createdAt":"2024-09-22T03:28:15.049Z","updatedAt":"2024-09-22T03:28:15.049Z","publishedAt":"2024-09-22T03:28:15.057Z","locale":null},{"id":4,"documentId":"h8inmkcalhume7larq04j29j","userAge":14,"userName":"piyopiyo","createdAt":"2024-09-22T03:28:48.983Z","updatedAt":"2024-09-22T03:28:48.983Z","publishedAt":"2024-09-22T03:28:48.995Z","locale":null}],"meta":{"pagination":{"page":1,"pageSize":25,"pageCount":1,"total":2}}}

Strapiの[USERS&PERMISSIONS PLUGIN>Roles]の設定はコンテンツタイプのアクセス権限をselect allにしています。

どうかお力添えをお願いいたします。

0

1Answer

たぶんPUTの部分で更新すると思うんですが、ここのuserIdってどうなってます?

  const apiUrl = `${process.env.STRAPI_URL_BASE}/api/str-practices/${userId}`;
0Like

Comments

  1. @RRRaaa

    Questioner

    お読みいただきありがとうございます。
    そちらのURLの${userId}は、buttonを押した行のuserIdが入るようになってます。
    例えば、idが2のupdateボタンを押したら、以下のようになります。
    http://127.0.0.1:1337/api/str-practices/2

    コンソールログでapiUrlを出力して確認済みです。

  2. あ、もしかしたらdocumentId(xfmmnvfbhd7f88abt5jiokksとか)を設定するのかもですね
    ためしにdocumentIdでGETするとどうです?

Your answer might help someone💌