javascript 如何让一个变量从前台传递给一个服务人员?

lnlaulya  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(100)

一些背景

我已经创建了一个服务工作者来向注册用户发送通知。
它工作得很好,直到我试图实现一种id到每个人谁注册到一个服务工作者(发送通知)。

  • 我这样做是因为我必须从我的数据库中删除旧的注册,所以我选择让每个用户三个注册(一个用于移动的设备,另外两个用于计算机上的不同导航器),如果有更多的注册,我想从数据库中删除旧的注册。*

工具

我使用nodejs、express和mySql作为数据库。

问题

启动订阅时出现以下错误:

SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)

我在另一篇文章中看到,这是因为他们试图对已经是对象内容进行JSON.parse。
但在我的例子中,我找不到我解析的地方,看到的是哪个部分:

// service.js (service worker file)

// saveSubscription saves the subscription to the backend
const saveSubscription = async (subscription, usrCode) => { 
  const SERVER_URL = 'https://mywebsite:4000/save-subscription' 
  subscription = JSON.stringify(subscription);
  console.log(subscription); // I got here what I expect
  console.log(usrCode); // <-------------------------------- HERE I GOT UNDEFIND
  const response = await fetch(SERVER_URL, {
    method: 'post', 
    headers: { 
      'Content-Type' : 'application/json', 
    }, 
    body : {
      subscription: subscription,
      usrCode: usrCode
    }
  }) 
  return response
}

但是当我在检查器中使用console.log(usrCode)时,我得到了很好的值。
那么,我应该如何获取service.js中的值

也许问题就出在:

const bodyParser = require('body-parser')
app.use(bodyParser.json())

一开始我以为问题是从后面来的(因为我不太擅长异步函数)。
这是背面,如果我弄错了什么.

// index.js (backend)

// Insert into database
const saveToDatabase = async (subscription, usrCode) => {
  // make to connection to the database.
  pool.getConnection(function (err, connection) {
    if (err) throw err; // not connected!
    console.log(usrCode);
    console.log(subscription);
    connection.query(`INSERT INTO webpushsub (webpushsub_info, webpushsub_code) VALUES ('${subscription}', '${usrCode}')`, function (err, result, fields) {
      // if any error while executing above query, throw error
      if (err) throw err;
      // if there is no error, you have the result
      console.log(result);
      connection.release();
    });
  });
}
// The new /save-subscription endpoint
app.post('/save-subscription', async (req, res) => {
  const usrCode = req.body.usrCode; // <------------------ I'm not sure about this part
  const subscription = req.body.subscription
  await saveToDatabase(JSON.stringify(subscription, usrCode)) //Method to save the subscription to Database
  res.json({ message: 'success' })
})
nkoocmlb

nkoocmlb1#

通过google搜索,我找到了this tutorial .所以usrCode未定义的原因是因为服务工作者不能访问存储在前面的数据.首先你必须在URL中传递它,如下所示:

// swinstaller.js (front)

// SERVICE WORKER INITIALIZATION
const registerServiceWorker = async (usrCode) => {
  const swRegistration = await navigator.serviceWorker.register('service.js?config=' + usrCode); //notice the file name
  return swRegistration;
}

然后又把它弄到服务工人的身上:

// service.js (service worker file)

// get the usrCode
const usrCode = new URL(location).searchParams.get('config');

相关问题