Javascript 未设置标头node.js api推送通知
你好,我正在尝试为我的webapp设置推送通知 我得到了我应该得到的订阅 它将正确地保存到我的数据库中 如果数据库中只有一个用户,它会像应该的那样发送我的通知 我想发送给不止一个用户:) 即时通讯使用:Javascript 未设置标头node.js api推送通知,javascript,node.js,api,push-notification,Javascript,Node.js,Api,Push Notification,你好,我正在尝试为我的webapp设置推送通知 我得到了我应该得到的订阅 它将正确地保存到我的数据库中 如果数据库中只有一个用户,它会像应该的那样发送我的通知 我想发送给不止一个用户:) 即时通讯使用: Vue.js(框架) Axios(邮政) node.js(api) mongoDB(数据库) 这是我在API上的帖子 await axios({ method: 'post', url: 'API', data: {
- Vue.js(框架)
- Axios(邮政)
- node.js(api)
- mongoDB(数据库)
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也尝试设置头。您应该只使用
webpush.sendNotification(订阅,负载).catch(err=>console.error(err))
您收到此错误,因为res.status(201).json({})已经设置了头并将响应发送回客户端,但是webpush.sendNotification也尝试设置头。您应该只使用webpush.sendNotification(订阅,负载).catch(err=>console.error(err))
res.json([body])
设置相应的头并发送结果:
发送JSON响应。此方法发送一个响应(具有正确的内容类型),该响应是使用JSON.stringify()转换为JSON字符串的参数
所以,首先,您不需要手动设置标题。
其次,如果响应
包含多个项,因为您不能为一个请求发送多个结果,所以您不应该在映射
中使用res.json
。
此外,请注意webpush.sendNotification
也可能发送结果。res.json([body])
设置相应的头并发送结果:
发送JSON响应。此方法发送一个响应(具有正确的内容类型),该响应是使用JSON.stringify()转换为JSON字符串的参数
所以,首先,您不需要手动设置标题。
其次,如果响应
包含多个项,因为您不能为一个请求发送多个结果,所以您不应该在映射
中使用res.json
。
此外,请注意
webpush.sendNotification
,它可能也会发送结果。您收到此错误是因为res.status(201).json({})
已经设置了头并将响应发送回客户端,但是webpush.sendNotification
也在尝试设置头。出现此错误的原因是res.status(201).json({})
已经设置了标题并将响应发送回客户端,但是webpush.sendNotification
也在尝试设置标题。嘿,非常感谢!它可以工作,但现在我在发送通知后收到一个超时:“加载URL失败:请求的资源上不存在“访问控制允许源站”标头。因此不允许访问源站“URL”。响应的HTTP状态代码为503。”
在res.setHeader?var options={headers:{Access Control Allow Origin',“*”,“'Access Control Allow headers':'“Origin,x-Requested-With,Content Type,Accept”}中的选项参数中,将它们添加到您的请求头中(订阅、有效负载、选项)
让我们来看看。嘿,非常感谢!它可以工作,但现在在发送通知后我得到一个超时:“加载URL失败:请求的资源上不存在“Access Control Allow Origin”头。因此不允许访问源“URL”。响应的HTTP状态代码为503。”
在res.setHeader?var options={headers:{Access Control Allow Origin',“*”,“'Access Control Allow headers':'“Origin,x-Requested-With,Content Type,Accept”}中的选项参数中,将它们添加到您的请求头中(订阅、有效负载、选项)
让我们来看看。非常感谢!但现在我在发送通知后收到一个超时:“加载URL失败:请求的资源上不存在“访问控制允许源站”标头。因此不允许访问源站“URL”。响应的HTTP状态代码为503。”非常感谢!但现在我在发送通知后收到一个超时:“加载URL失败:请求的资源上不存在“访问控制允许源站”标头。因此不允许访问源站“URL”。响应的HTTP状态代码为503。”