Azure Functions中Async/Await语法报错及异步调用实现咨询
问题解答:Azure Functions中async/await语法错误及异步调用方案
你的问题核心在于Azure Functions v1运行时默认使用的Node.js版本(6.x)不支持原生async/await语法,并不是Azure Functions本身不支持这个特性。下面分两部分详细说明:
一、为什么会出现这个语法错误?
从你的错误日志里的Node.js模块路径(vm.js、module.js的版本特征)可以看出,你的Function App正在使用Azure Functions v1运行时,它默认绑定Node.js 6.x版本。而async function语法是Node.js 7.6+才原生支持的,6.x版本无法识别这个语法,所以抛出了SyntaxError: Unexpected token function。
二、解决方法
方案1:升级到Azure Functions v2+运行时(推荐)
v2及以上的运行时支持Node.js 8及更高版本,原生支持async/await,不需要额外配置。操作步骤:
- 登录Azure门户,找到你的Function App
- 进入配置 > 应用程序设置
- 添加或修改应用设置
FUNCTIONS_EXTENSION_VERSION,将值设置为~2(或更高版本,比如~4对应最新的Node.js LTS版本) - 保存设置后,Function App会自动重启,之后就可以正常使用async/await语法了。
比如升级后,你的代码可以直接保留原写法:
async function getData() { var data = await postRequest(); return data; }; // 主函数也可以写成async风格 module.exports = async function(context, req) { try { const result = await getData(); context.res = { body: result }; } catch (err) { context.res = { status: 500, body: err.message }; } };
方案2:在v1运行时中用Promise链式调用替代async/await
如果暂时无法升级运行时,你可以将async/await的逻辑转换成Promise的链式调用,同时把回调风格的API封装成Promise(以node-rest-client为例):
- 先把
postRequest封装成返回Promise的函数:
const Client = require('node-rest-client').Client; function postRequest() { return new Promise((resolve, reject) => { const client = new Client(); // 替换成你的实际请求配置 const requestArgs = { data: { /* 请求体数据 */ }, headers: { "Content-Type": "application/json" } }; client.post('https://your-target-api.com', requestArgs, (data, response) => { if (response.statusCode >= 200 && response.statusCode < 300) { resolve(data); } else { reject(new Error(`Request failed with status ${response.statusCode}`)); } }) .on('error', (err) => { reject(err); // 捕获请求层面的错误 }); }); }
- 修改
getData使用Promise链式调用:
function getData() { return postRequest() .then(data => { // 可以在这里对数据做处理 return data; }) .catch(err => { // 处理或向上抛出错误 throw new Error(`Failed to get data: ${err.message}`); }); }
- 在主函数中调用
getData:
module.exports = function(context, req) { getData() .then(result => { context.res = { body: result }; context.done(); }) .catch(err => { context.res = { status: 500, body: err.message }; context.done(); }); };
这样就能在v1运行时中实现异步调用,避免语法错误。
内容的提问来源于stack exchange,提问作者Pradipe Yoggi
相关产品推荐
相关产品推荐

