You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为例):

  1. 先把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); // 捕获请求层面的错误
    });
  });
}
  1. 修改getData使用Promise链式调用:
function getData() {
  return postRequest()
    .then(data => {
      // 可以在这里对数据做处理
      return data;
    })
    .catch(err => {
      // 处理或向上抛出错误
      throw new Error(`Failed to get data: ${err.message}`);
    });
}
  1. 在主函数中调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:20:52