Error: Data must be an object, value must be an array - Posting Expo push token from Rails app
Error: Data must be an object, value must be an array - Posting Expo push token from Rails app
我有一个 Rails 应用程序,我想通过 sidekiq 向 Expo 发送一个 post 请求,以便处理应用程序内通知。该应用程序的 API 是使用 Node.JS 构建的,推送令牌使用此代码成功执行:
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'}
也不起作用。
我也用 [ ]
、params.to_json
和 params.as_json
尝试过 data: [status: 'ok']
,但我得到了同样的错误。
如何通过此 Rails post 请求将此 data
对象成功发送到 expo 推送令牌?
这是我应用程序中的有效代码,你能试试这个吗
在您触发作业的控制器中,执行以下操作
# 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
我有一个 Rails 应用程序,我想通过 sidekiq 向 Expo 发送一个 post 请求,以便处理应用程序内通知。该应用程序的 API 是使用 Node.JS 构建的,推送令牌使用此代码成功执行:
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'}
也不起作用。
我也用 [ ]
、params.to_json
和 params.as_json
尝试过 data: [status: 'ok']
,但我得到了同样的错误。
如何通过此 Rails post 请求将此 data
对象成功发送到 expo 推送令牌?
这是我应用程序中的有效代码,你能试试这个吗
在您触发作业的控制器中,执行以下操作
# 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