本文档介绍如何使用边缘函数 CLI 中基于函数模板创建函数。
对于边缘函数 CLI,您可以选择的函数模板取决于您是否设置了 Access Key ID 和 Secret Access Key:
在您的设备上运行以下命令。该命令会安装边缘函数 CLI,然后创建一个函数项目,并在函数项目中创建一个本地函数。参见 nest init。
$ npx @volcengine/nest@latest init
根据命令行提示设置函数的名称,并选择一个函数模板。然后,按回车键确定。
$ npx @volcengine/nest@latest init Need to install the following packages: @volcengine/nest@1.0.0 Ok to proceed? (y) y ✓ Name: test ? Select a template you want to start with: ▸ URL Rewriting Rewrite URL links in webpages using HTML Rewriter. Aggregate Requests HTTP to HTTPS Upgrade JSON Processing Modify Origin Server Error Response Pages CORS (Cross-Origin Resource Sharing) Handling
按您的需求,根据命令行提示设置其他参数并按回车键确认。
$ npx @volcengine/nest@latest init Need to install the following packages: @volcengine/nest@1.0.0 Ok to proceed? (y) y
命令运行完成后,您当前的目录结构如下:
└── 📁MyFolder └── 📁test └── nest.json └── package-lock.json └── package.json └── 📁src └── index.js └── package.json
其中,test 目录是您创建的函数项目,test/src/index.js 是您的本地函数的入口文件。index.js 文件的内容就是您选择的函数模板。
您可以在 MyFolder 目录通过以下命令查看根据函数模板生成的代码文件。
$ cat test/src/index.js addEventListener('fetch', event => { event.respondWith(onFetch(event)); }) const OLD_URL = "s.taobao.com"; const NEW_URL = "s.mynewdomain.com"; async function onFetch(event) { const path = event.request.path; const response = await fetch(`https://www.taobao.com${path}`); const rewrite = function(element, tag) { if (element.hasAttribute(tag)) { const href = element.getAttribute(tag); const new_href = href.replace(OLD_URL, NEW_URL); console.log(`replace(${tag}) ${href} => ${new_href}`); element.setAttribute(tag, new_href); } } const rewriteBody = createHtmlStream( response.body, undefined, [ [ 'a', // CSS selector, 'a' stands for selecting all the 'a' tags in the webpage { // This onElement callback will be triggered after 'a' tags in the webpage are parsed onElement(element) { rewrite(element, "href") } } ], [ 'img', { // This onElement callback will be triggered after 'img' tags in the webpage are parsed onElement(element) { rewrite(element, "src") } } ] ] ); return new Response( rewriteBody, { status: response.status, headers: response.headers } )