我的代码以及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);
}
它将按原样与云功能一起使用,还是需要将其重新编写为异步状态?另外,类似上述的内容更适合应用引擎吗?
答案 0 :(得分:0)
这就是我最终更改代码的方式。当我启动并测试云功能时,它可以正常工作,因此我假设它很好...直到我学会其他方法为止。
"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()?主要考虑redis的“错误”功能。
启动该功能时,我使用了控制台并从下拉菜单中设置了环境变量。我使用了我的memorystore实例中的设置(包括主机ip和端口),但是在设置无服务器vpc访问时,我设置的连接器具有单独的ip地址。那么,该功能如何发现我的Redis实例超出了我的范围,除非连接器仅使您进入vpc,然后您可以通过列出的ip访问范围内为该项目运行的任何服务?
我想设置多个连接器是否好?还是每个功能都有连接器?
我听说使用unix套接字是个好主意,因为它可以提高吞吐量或其他功能,但是我不确定无服务器解决方案是否可以实现。