next.js Strapi 4如何让每个用户的音乐事件

bpzcxfmw  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在用strapi 4和nextjs。
在应用程序strapi持有音乐事件为每个用户和每个用户应该能够添加和检索他们自己的音乐事件。
我无法从strapi 4检索每个用户的音乐事件
我有自定义路由和自定义控制器
自定义路由位于名为custom-event.js的文件中,工作正常,如下所示:

module.exports = {
  routes: [
    {
      method: 'GET',
      path: '/events/me',
      handler: 'custom-controller.me',
      config: {
        me: {
          auth: true,
          policies: [],
          middlewares: [],
        }
      }
    },
  ],
}

控制器ID是一个名为custom-controller.js的文件,如下所示:

module.exports = createCoreController(modelUid, ({strapi }) => ({
  async me(ctx) {
    try {
      const user = ctx.state.user;

      if (!user) {
        return ctx.badRequest(null, [
          {messages: [{ id: 'No authorization header was found'}]}
        ])
      }

      // The line below works ok
      console.log('user', user);

      // The problem seems to be the line below
      const data = await strapi.services.events.find({ user: user.id})
      
      // This line does not show at all 
      console.log('data', data);

      if (!data) {
        return ctx.notFound()
      }

      return sanitizeEntity(data, { model: strapi.models.events })
    } catch(err) {
      ctx.body = err
    }
  }
}))

注意有两个console.log,第一个console.log输出用户信息,第二个console.log输出它根本不显示的数据。
custom-controller.js中的以下行似乎是问题所在,它适用于strapi 3,但似乎不适用于strapi 4

const data = await strapi.services.events.find({ user: user.id})
ogq8wdun

ogq8wdun1#

经过很长时间的努力,事实上是几天,我终于让它工作了。下面是我想出的代码。我发现我需要两个数据库查询,因为我不能用一个查询得到事件来填充图像。所以我得到了事件ID,然后在事件查询中使用事件ID来得到事件和图像。
下面是代码:

const utils = require('@strapi/utils')
const { sanitize } = utils

const { createCoreController } = require("@strapi/strapi").factories;
const modelUid = "api::event.event"

module.exports = createCoreController(modelUid, ({strapi }) => ({
  async me(ctx) {
  try {
  const user = ctx.state.user;

  if (!user) {
    return ctx.badRequest(null, [
      {messages: [{ id: 'No authorization header was found'}]}
    ])
  }

     // Get event ids 
  const events = await strapi
    .db
    .query('plugin::users-permissions.user')
    .findMany({
        where: {
          id: user.id
        },
        populate: { 
          events: { select: 'id'}
        }
      })

 

      if (!events) {
        return ctx.notFound()
      }

      // Get the events into a format for the query
      const newEvents = events[0].events.map(evt => ({ id: { $eq: evt.id}}))

      // use the newly formatted newEvents in a query to get the users
      // events and images
      const eventsAndMedia = await strapi.db.query(modelUid).findMany({
        where: {
          $or: newEvents
        },
        populate: {image: true}
      })

     return sanitize.contentAPI.output(eventsAndMedia, 
                     strapi.getModel(modelUid))
    } catch(err) {
      return ctx.internalServerError(err.message)
    }
  }
}))

相关问题