Home > Blockchain >  How to dynamically add CORS sites to Google Cloud App Engine Node API
How to dynamically add CORS sites to Google Cloud App Engine Node API

Time:10-17

I am new to API deployment.

I have a Node Express API that has CORS enabled in the root app.js, for the API and a socket.io implementation:

var app = express();
app.use(cors({
   origin : ["http://localhost:8080", "http://localhost:8081"],
   credentials: true
}))

and

const httpServer = createServer(app);
const io = new Server(httpServer, { 
    cors: {
        origin: ["http://localhost:8080", "http://localhost:8081"],
        credentials: true,
        methods: ["GET"]
    }
});

I will set up a sales website that allows a customer to pay for a license to use the API with their site, i.e. https://www.customersite.com

My question is how can I dynamically add the customer's website (say after they submit a form from another site) to the CORS list? Ideally it would be via an API call. The only option which I can think of (that is not automated) is to manually maintain a global js file (i.e. config.js) with the cors list from within the Google platform using the file explorer / editor, and to iterate over it as an array similar to process.env.customerList. This will not work for me as I need to have this step happen automatically.

Any and all suggestions are appreciated.

CodePudding user response:

Solution: Use a process manager like pm2 to 'reload' the API gracefully with close to no downtime.

PM2 reloads can be triggered programmatically. I made a PUT endpoint for modifying CORS list /cors/modify that sent a programmatic pm2 message when a successful modification was done.

Note: on Windows OS must use programmatic messaging:

pm2.list(function(err, list) {
    pm2.sendDataToProcessId(list[0].pm2_env.pm_id, 
        {
            type : 'process:msg',
            data : {
                msg : 'shutdown'
            },
            topic: true
        },
        function(err, res) {
            console.log(err);
            pm2.disconnect();   // Disconnects from PM2
        }
    );
    if (err) {
        console.log(err);
        pm2.disconnect();   // Disconnects from PM2
    }
});

which can then be caught with

process.on('message', async function(msg) {
    if (msg == "shutdown" || msg.data.msg == 'shutdown') {
        console.log("Disconnecting from DB...");
        mongoose.disconnect((e => {
            if (e) {
                process.exit(1)
            } else {
                console.log("Mongoose connection removed");
                httpServer.close((err) => {
                    if (err) {
                        console.error(err)
                        process.exit(1)
                    }
                    process.exit(0);
                })
            }
        }));
    }
});
  • Related