Google App Engine + Cloud SQL - Писать несколько раз за один звонок? - PullRequest
0 голосов
/ 04 апреля 2019

У меня проблема с написанием 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 App

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.

Есть ли у кого-нибудь какие-либо идеи или ... какие-либо знания о том, что я могу сделать, чтобы предотвратить эти двойные, тройные записи? Это огромная дыра в кармане, если дублирующие данные пишутся каждый раз, когда я пытаюсь вставить больше информации в таблицу.

1 Ответ

0 голосов
/ 04 апреля 2019

Простое решение состоит в том, чтобы использовать что-то вроде Google Analytics , для которого требуется только вставить 4 строки javascript в ваш интерфейс и предоставить более надежную информацию, чем решение для домашнего приготовления.

Если вам абсолютно необходимо что-то сделать самостоятельно, вам нужно будет соединить временную метку с идентифицируемым идентификатором некоторого вида. В противном случае каждое обновление страницы даст вам новую запись. Затем при вставке в базу данных используйте сырой SQL и добавьте ON DUPLICATE KEY UPDATE в конец INSERT (в настоящее время Knex не поддерживает эту функцию через ORM - см. здесь .)

Для того, какой идентификатор вы используете, держитесь подальше от использования IP-адреса - люди из той же сети будут использовать один и тот же IP-адрес, что означает, что вы будете дедуплировать посещения, которые вам не нужны. Вместо этого я бы предложил сгенерировать UUID и сохранить его в файле cookie для пользователя.

...