Azure Function提示JS语法错误,但语法已验证合法的问题排查
错误原因
这个SyntaxError: Unexpected token function错误的根源很明确:你的Azure Function所使用的Node.js运行时版本不支持ES2017引入的async function语法。
async/await是在Node.js 7.6.0版本才正式成为稳定特性并默认启用的。如果你的Function App配置的Node.js版本低于7.6.0(比如早期的Node.js 6.x版本,这曾是Azure Functions的默认版本之一),Node.js的虚拟机(VM)模块在解析代码时会无法识别async function这种语法结构,从而抛出这个错误。
排查与解决建议
检查并更新Azure Functions的Node.js运行时版本
- 登录Azure门户,定位到你的Function App资源
- 进入左侧导航栏的「配置」→「常规设置」页面
- 在「运行时版本」下拉菜单中,选择Node.js 8.x及以上的长期支持(LTS)版本(比如当前的18.x或20.x版本)
- 保存配置后,重启Function App使变更生效
对齐本地与云端的Node.js版本
在本地开发环境中,打开终端执行node -v命令,确认本地使用的Node.js版本和Azure上配置的版本一致,避免出现本地调试正常但部署后报错的情况兼容旧版本的备选方案(不推荐)
如果因特殊限制无法升级Node.js版本,可以使用Babel将ES2017代码转译为兼容旧版本的ES5代码,但这会增加项目的构建复杂度,因此优先推荐直接升级Node.js版本
附:你的代码与错误信息
代码示例
module.exports = async function (context, req) { if (req.query.name || (req.body && req.body.name)) { // generate mock result const mockChecker = new mockCheckBuild(); const result = await mockChecker.runAsync(); context.res = { body: result }; } else { context.res = { status: 400, body: "Please pass a name on the query string or in the request body" }; } context.done(); }; function mockCheckBuild() { this.statuses = ['Failed', 'Complete']; this.branchId = 808; this.buildNumbers = ['0.1.1.1023', '0.1.1.1024', '0.1.1.1025']; this.runAsync = async function() { return new Promise(resolve => setTimeout(() => resolve({ branchId: this.branchId, latestBuild: this.statuses.randomElement(), buildStatus: this.buildNumbers.randomElement() }) , 2000) ); }; return this; } Array.prototype.randomElement = function() { const index = Math.floor(Math.random() * this.length); return this[index]; };
错误信息
"Exception while executing function: Functions.CheckLatestBuild -> One or more errors occurred. -> D:\home\site\wwwroot\CheckLatestBuild\index.js:1\n(function (exports, require, module, __filename, __dirname) { module.exports = async function (context, req) {\n
^^^^^^^^\n\nSyntaxError: Unexpected token function\n at createScript (vm.js:56:10)\n at Object.runInThisContext (vm.js:97:10)\n at Module._"
内容的提问来源于stack exchange,提问作者Hiram Katz

