Нужно ли переписывать код, чтобы он был асинхронным для всех операций с БД? - PullRequest
0 голосов
/ 05 июня 2019

На моем компьютере разработчика работает этот код вместе с экземпляром Redis.

if (req.url === "/get_id" && req.method === "GET") {
    console.log("Requesting an id");

    //Generate unique ID's until one is found and return it to the client
    let currentString = "";
    do {
      currentString = randomString({ length: 10 });
    } while (redisClient.SISMEMBER("uniqueSet", currentString) === 1);
    //the above will run until currentString is unique

    //add unique value to set
    redisClient.sadd("uniqueSet", currentString);
    console.log(currentString);

    //now return to client and close
    res.end(currentString);
  }

Будет ли он работать с облачными функциями как есть, или мне нужно будет переписать его, чтобы он был асинхронным? Кроме того, будет ли что-то подобное выше подходящим для app-engine?

1 Ответ

0 голосов
/ 05 июня 2019

Вот так я и сменил код.Когда я запустил и протестировал облачную функцию, она работала, поэтому я собираюсь предположить, что все в порядке ... пока я не научусь иначе.

"use strict";

//const functions = require("firebase-functions");
const randomString = require("crypto-random-string");
const redis = require("redis");
const { promisify } = require("util");

const REDISHOST = process.env.REDISHOST;
const REDISPORT = process.env.REDISPORT;

//use the unix socket option in production
const redisClient = redis.createClient(REDISPORT, REDISHOST); //unix_socket
const sismemberAsync = promisify(redisClient.sismember).bind(redisClient);

redisClient.on("error", function(err) {
  return;
  // but since this is an http function should I be calling res.end()?
});

//exports.my_id = functions.https.onRequest((req, res) => {
exports.my_id = (req, res) => {
  async function getUnique() {
    try {
      //console.log("top function firing");
      let currentString = randomString({ length: 10 });
      let result = await sismemberAsync("uniqueSet", currentString);
      //console.log(result);

      // the element is unique
      if (result == 0) {
        //console.log("We are unique");
        redisClient.sadd("uniqueSet", currentString);
        res.end(currentString);
      }

      // the element is not unique
      if (result === 1) {
        //console.log("we are not unique");
        getUnique(); // try again
      }

      // the operation failed
      if (result === undefined) {
        //console.log("the async operation failed");
        getUnique(); // try again
        //res.end();
      }
    } catch (error) {
      res.end();
    }
  }

  // invoke the above function
  getUnique();
};

Вещи, в которых я все еще не уверен, на случай, если кто-нибудь ещеможет оказаться полезным:

Если облачная функция является вызванной функцией http, вызывает ли функция return завершение своего выполнения или вам нужно вызвать res.end () или другую функцию res.function ()?Главным образом задумался о повторном включении функции «ошибка».

Когда я запустил функцию, я использовал консоль и установил переменные среды из выпадающего меню.Я использовал настройки из своего экземпляра memorystore (включая ip и порт хоста), но при настройке vpc-доступа без сервера у настроенного мной коннектора был отдельный ip-адрес.Итак, как функция обнаружила, что мой экземпляр Redis мне не известен, если только соединитель не доставит вас к vpc, а затем вы не сможете получить доступ к любым службам, работающим для проекта в области действия, через перечисленные там ip?

Интересно, если этохорошо настроить несколько разъемов?Или разъем для каждой функции?

Я слышал, что было бы неплохо использовать Unix-сокеты, потому что это позволяет увеличить пропускную способность или что-то в этом роде, но я не уверен, возможно ли это с решениями без серверов.

...