Google App Engine + Cloud SQL - 只需一次通话即可多次写入?

问题描述 投票:0回答:1

我遇到了正确写入Cloud SQL和Google App Engine的问题。使用NoSQL与Cloud SQL和Google App Engine写入数据库,我设法获得连接 - 这太棒了!

唯一的问题是,当我为应用程序insertVisit(knex, visit)运行插入函数时,单个调用有多个写入。这是所有相关的代码。

app.js

//Connecting to the NoSQL Cloud SQL database, and using Knex to do all database-y things. 

const knex = connect();

function connect () {   
  const config = {
      socketPath: "/cloudsql/<INSTANCE_CONNECTION_NAME>",
      user: "USERNAME",
      password: "PASSWORD",
      database: "DATABASE"
  };

  // Connect to the database
  const knex = Knex({
    client: 'mysql',
    connection: config
  });

  return knex;
}

function insertVisit (knex, visit) {
      return knex('user_visits').insert(visit);
    }
}

function getVisits (knex) {
  return knex.select().table('user_visits').pluck('visits')
}

App Engine结尾

app.get('/new_visit', (req, res, next) => {

  // Create a visit record to be stored in the database
  const visit = {
    visits: new Date()
  }

  insertVisit(knex, visit)
    // return a response
    .then(() => {
      res
        .status(200)
        .set('Content-Type', 'text/plain')
        .send(`successfully created.`)
        .end();
    })
    .catch((err) => {
      next(err);
    });
});

app.get('/see_visits', (req, res, next) => {
  getVisits(knex)
  .then( (visits) => {
    res
        .status(200)
        .set('Content-Type', 'text/plain')
        .send(`Last 10 visits:\n${visits.join('\n')}`)
        .end();
  })
})

我回复一切都很好。但是,当我访问new_visit一次,然后see_visits我希望在网页上回复,说:

Last 10 Visits: 

Aug 10 12:34:56 
Aug 11 23:11:45 

相反,我知道正在发生双重(或三重)呼叫,因为我得到:

Last 10 Visits: 

Aug 10 12:34:56
Aug 10 12:34:57
Aug 10 12:34:57
Aug 11 23:11:45
Aug 11 23:11:46

相关的app.yaml字段如下:

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

这是Google的默认建议。

有没有人有任何见解或...有什么知识可以防止这些双重,三重写入发生?如果每次我尝试在表格中插入更多信息时都会写入重复数据,那么这是一个巨大的漏洞。

node.js google-app-engine nosql google-cloud-sql knex.js
1个回答
0
投票

简单的解决方案是使用像Google Analytics这样的东西,它只需要在你的前端插入4行javascript,并提供比家庭酿造解决方案更可靠的信息。

如果您绝对需要自己做某事,那么您将不得不将时间戳与某种可识别的ID配对。否则,每次刷新页面都会为您提供一个新条目。然后在插入数据库时​​,使用原始SQL并将ON DUPLICATE KEY UPDATE添加到INSERT的末尾(Knex目前不通过ORM支持此功能 - 请参阅here。)

对于您使用的ID,请远离使用IP地址 - 来自同一网络的人员将共享IP,这意味着您将重复访问您不想要的访问。相反,我建议生成一个UUID并将其存储在用户的cookie中。

© www.soinside.com 2019 - 2024. All rights reserved.