This example uses headers and cookies, which are only accessible when your Function is running @twilio/runtime-handler
version 1.2.0
or later. Consult the Runtime Handler guide to learn more about the latest version and how to update.
A common use case is to call Functions from a Flex Plugin to retrieve external data such as statistics. Sometimes, this results in Cross-Origin Resource Sharing (CORS) restrictions in production environments due to the different hostnames between the Flex Plugin and the Function being called.
Fortunately, CORS errors, in this context or other situations, can be addressed by leveraging the response headers of the Function to allow any Origin, as shown in the following example code.
In order to run any of the following examples, you will first need to create a Function into which you can paste the example code. You can create a Function using the Twilio Console or the Serverless Toolkit as explained below:
If you prefer a UI-driven approach, creating and deploying a Function can be done entirely using the Twilio Console and the following steps:
https://<service-name>-<random-characters>-<optional-domain-suffix>.twil.io/<function-path>
test-function-3548.twil.io/hello-world
.
Your Function is now ready to be invoked by HTTP requests, set as the webhook of a Twilio phone number, invoked by a Twilio Studio Run Function Widget, and more!
Allow for a client-side Flex Plugin to communicate with a Function on a different host
_36exports.handler = (context, event, callback) => {_36 // Access the NodeJS Helper Library by calling context.getTwilioClient()_36 const client = context.getTwilioClient();_36_36 // Create a custom Twilio Response_36 const response = new Twilio.Response();_36 // Set the CORS headers to allow Flex to make an error-free HTTP request_36 // to this Function_36 response.appendHeader('Access-Control-Allow-Origin', '*');_36 response.appendHeader('Access-Control-Allow-Methods', 'OPTIONS, POST, GET');_36 response.appendHeader('Access-Control-Allow-Headers', 'Content-Type');_36_36 // Use the NodeJS Helper Library to make an API call and gather_36 // statistics for the Flex Plugin._36 // Note that the workspace SID is passed from the event parameter_36 // of the incoming request._36 client.taskrouter.v1_36 .workspaces(event.WorkspaceSid)_36 .workers()_36 .cumulativeStatistics()_36 .fetch()_36 .then((data) => {_36 response.appendHeader('Content-Type', 'application/json');_36 response.setBody(data);_36 // Return a success response using the callback function_36 return callback(null, response);_36 })_36 .catch((err) => {_36 response.appendHeader('Content-Type', 'plain/text');_36 response.setBody(err.message);_36 response.setStatusCode(500);_36 // If there's an error, send an error response._36 // Keep using the response object for CORS purposes._36 return callback(null, response);_36 });_36};
If you want to learn more about Flex Plugins that would be invoking a Function in this way, check out this tutorial on calling a Function from a Flex Plugin.