Ошибка: данные должны быть объектом, значение должно быть массивом - Push-токен Posting Expo из приложения Rails - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть приложение Rails, и через sidekiq я хочу отправить запрос на отправку в Expo, чтобы обработать уведомление в приложении.API приложения создается с использованием Node.JS, и push-токен успешно выполняется с этим кодом:

                    axios({
                        method: "post",
                        url: "https://exp.host/--/api/v2/push/send",
                        data: {
                            to: result.expo_push_token,
                            title: `${data.user.first_name}`,
                            sound: "default",
                            body: shortMessage,
                            data: {
                                status: "ok",
                                body: shortMessage,
                                title: `${data.user.first_name}`,
                                msgUser: data.user,
                                convoId: data.room,
                            }
                        }
                    })

В приложении Rails все работало нормально, пока я не хотел передать объект данных в приложение.Вот что сработало:

        push_tokens = PushToken.where(user_id: other_user)

        push_tokens.each do |token|
            params = ({

              to: token.expo_push_token,
              title: user.first_name,
              sound: "default",
              body: msg.body
            })


            puts params
            puts params.class

            x = Net::HTTP.post_form(URI.parse('https://exp.host/--/api/v2/push/send'), params)
            puts x.body

И затем, когда я добавляю объект данных, он выдает ошибку: {'errors':[{"code":'API_ERROR','message':'child \'data\' fails because [\'data\' must be an object], \'value\' must be an array.'}]}

        push_tokens.each do |token|
            params = ({

              to: token.expo_push_token,
              title: user.first_name,
              sound: "default",
              body: msg.body,
              data: {
                status: "ok",
                msgUser: {
                  id: user.id,
                  avatar_file_name: user.avatar_file_name,
                  first_name: user.first_name,
                },
                convoId: msg.convo_id,
                body: msg.body,
                title: user.first_name,
              },
            })


            puts params
            puts params.class

            x = Net::HTTP.post_form(URI.parse('https://exp.host/--/api/v2/push/send'), params)
            puts x.body

Первоначально я передавал ActiveRecord в данные msgUser: user и подумал, что, может быть, в этом проблема, но это не имело значения, когда я сам создал массив, выполнив: msgUser: {id: user.id, avatar_file_name: user.avatar_file_name, first_name: user.first_name,},.Простой data: {status: 'ok'} тоже не работает.

Я также пробовал data: [status: 'ok'] с [ ], params.to_json и params.as_json, но я получаю ту же ошибку.

Как я могу успешно отправить этот data объект через этот почтовый запрос Rails на push-токен выставки?

1 Ответ

0 голосов
/ 26 сентября 2018

Это рабочий код в моем приложении, вы можете попробовать это

В вашем контроллере, где вы запускаете свою работу, выполните следующее

# Controller
push_tokens.each do |token|
  WorkerClass.perform_async(token, @user)
end

# Worker file
class WorkerClass
  def perform(token, user)
    uri = URI.parse("https://exp.host/--/api/v2/push/send")
    Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
      request = Net::HTTP::Post.new(uri.path, {'Content-Type' => 'application/json'})
      request.body = {"to"=>token.expo_push_token, "title"=>user.first_name, "body"=>"your_message", "data"=>{"status"=>"ok"}}.to_json
      response = http.request(request)
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...