我遇到了正确写入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的默认建议。
有没有人有任何见解或...有什么知识可以防止这些双重,三重写入发生?如果每次我尝试在表格中插入更多信息时都会写入重复数据,那么这是一个巨大的漏洞。
简单的解决方案是使用像Google Analytics这样的东西,它只需要在你的前端插入4行javascript,并提供比家庭酿造解决方案更可靠的信息。
如果您绝对需要自己做某事,那么您将不得不将时间戳与某种可识别的ID配对。否则,每次刷新页面都会为您提供一个新条目。然后在插入数据库时,使用原始SQL并将ON DUPLICATE KEY UPDATE
添加到INSERT
的末尾(Knex目前不通过ORM支持此功能 - 请参阅here。)
对于您使用的ID,请远离使用IP地址 - 来自同一网络的人员将共享IP,这意味着您将重复访问您不想要的访问。相反,我建议生成一个UUID并将其存储在用户的cookie中。