Azure Function仅返回错误响应不返回正常执行结果问题排查
问题根因
- 你将Azure Function入口函数声明为
async类型,但内部调用的addUser是基于回调的异步方法,async函数执行时不会等待回调触发,会直接完成执行,runtime会提前回收执行上下文,导致成功场景下context.res还没赋值函数就已经结束,自然不会返回201响应。 async模式的Azure Function不需要调用context.done()方法,该方法是回调模式下用来标记执行结束的,混用两种模式会导致执行逻辑异常。
修复方案
方案1:改用回调模式入口(改动最小)
直接去掉入口函数的async声明即可,修改后的index.js代码:
const insertUser = require('./db/insertUser') module.exports = function (context, req) { insertUser.addUser(req.body,(status,res1)=>{ context.res={ status, body: res1 }; context.done(); }) }
方案2:异步方法Promise化,适配async入口(更符合现代JS编码规范)
先修改insertUser.js把addUser改成返回Promise的方法:
require('./dbconnect') const user = require('./utill/user') const addUser = (body) =>{ return new Promise((resolve) => { const User = new user(body) User.save((error,result)=>{ if(result){ resolve({status:201, data:result}) } else{ resolve({status:401, data:error}) } }) }) } module.exports.addUser = addUser
再修改index.js用await调用:
const insertUser = require('./db/insertUser') module.exports = async function (context, req) { const {status, data} = await insertUser.addUser(req.body) context.res={ status, body: data }; }
内容的提问来源于stack exchange,提问作者ShahulRiyaz
相关产品推荐
相关产品推荐

