标头未设置 node.js api 推送通知

Posted

技术标签:

【中文标题】标头未设置 node.js api 推送通知【英文标题】:Headers not set node.js api push notification 【发布时间】:2018-09-19 12:21:21 【问题描述】:

您好,我正在尝试为我的 web 应用设置推送通知。

我得到了我应该得到的订阅。

它会正确地将其保存到我的数据库中。

如果数据库中只有一个用户,它会发送我的通知

我想发送给不止一个用户:)

我正在使用:

Vue.js(框架)

Axios(发布)

node.js (api)

mongoDB(数据库)

这是我发给 API 的帖子。

await axios(
          method: 'post',
          url: 'API',
          data: 
            subscription: JSON.stringify(subscription),
            storeId: storeId
          ,
          headers: 
            'Content-Type': 'application/json'
          
        )

它注册了我的帖子,但随后我收到了抛出错误。 即“发送后无法设置标题。”

我在我的应用程序中使用 CORS,如下所示:

const cors = require('cors')

const app = express();
app.use(bodyParser.json());
app.use(cors())
app.use(morgan('combined'))

我从我的网站处理帖子的方式是找到我的订阅,然后映射并说出 foreach 订阅

网络推送

//subscribe routes
app.post('/pushNotification', (req, res) => 
  var storeId = req.body.storeId
  res.setHeader('Content-Type', 'application/json');
  console.log(storeId)
  if (req.body.storeId != null) 
    console.log('Test1')
    //get pushSubscription object

    //create payload
    const payload = JSON.stringify( title: 'push test' )
    Push.find(
      "storeId": storeId
    ,
    'subscription', function(error, response) 
      console.log('Test2')
      console.log(response)
      response.map(item => 
        res.status(201).json();
        console.log('Test3')
        var subscription = item.subscription
        console.log(subscription)
        webpush.sendNotification(subscription, payload).catch(err => console.error(err));
      )
    )
   else 
    res.send("failed")
  
)

正如我在某处所读到的那样,我没有设置标题或正确的东西。我在教程和其他东西中使用过cors。

所以它就像是因为迭代错误而崩溃。 但我不知道怎么做。

错误信息:

提前致谢

【问题讨论】:

您收到此错误是因为res.status(201).json() 已经设置了标头并将响应发送回客户端,但webpush.sendNotification 也尝试设置标头。 【参考方案1】:

您收到此错误是因为 res.status(201).json() 已经设置了标头并将响应发送回客户端,但 webpush.sendNotification 也尝试设置标头。您应该只使用 @ 987654322@

【讨论】:

嘿,非常感谢!它有效,但现在我在发送通知后超时:"Failed to load URL: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'URL' is therefore not allowed access. The response had HTTP status code 503." 将这些添加到您的请求标头Access-Control-Allow-Headers': 'x-access-token 在 res.setHeader? var options=headers: "Access-Control-Allow-Origin", "*", '"Access-Control-Allow-Headers"': '"Origin, X-Requested-With, Content-Type, Accept"' sendNotification(subscription,payload,options) 的 Options 参数中 让我们continue this discussion in chat。【参考方案2】:

res.json([body])设置相应的header并发送结果:

发送 JSON 响应。此方法发送一个响应(具有正确的内容类型),该响应是使用 JSON.stringify() 转换为 JSON 字符串的参数。

所以,首先您不需要手动设置标题。 其次,如果response 有多个项目,由于您无法为请求发送多个结果,因此您不应在map 中使用res.json。 此外,请注意webpush.sendNotification,它也可能会发送结果。

【讨论】:

非常感谢!但现在我在发送通知后超时:“无法加载 URL:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。因此不允许访问源 'URL'。响应包含 HTTP状态码 503。”

以上是关于标头未设置 node.js api 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

Azure 移动应用 Node.js 后端 - 推送通知错误状态代码 400

Azure-> Node.js 中的 Easy api-> 如何发送 android 推送通知?

如何在 MobileFirst Foundation 8 中使用 REST API 从 Node.js 发送推送通知?

使用 Node JS 的 AWS SNS 推送通知

Node.js - 无法将 Apple 推送通知发送到开发设备以进行调试

当应用程序在后台时,推送通知未调用 didReceiveRemoteNotification