Node.js Serverless Lambda对接亚马逊MWS本地正常云端不执行问题
问题根因
amazonMws.fulfillmentOutboundShipment.create 是异步回调执行的方法,你当前的路由逻辑在调用该方法后没有等待执行完成就直接返回了响应。
- 本地运行
serverless-offline时是持续运行的Node进程,异步回调会在后台正常执行完成 - 部署到Lambda后,Lambda实例在返回HTTP响应后会立刻冻结运行环境,未执行完成的异步回调会直接被中断,所以看不到后续日志也不会生成订单
解决方案
步骤1:改造fba.js导出方法,将回调包装为Promise返回
修改fba.js中MWS调用的逻辑,把回调包裹为Promise返回,方便上层等待执行结果:
var amazonMws = require('amazon-mws')('MYKEY','MYSECRET'); module.exports = function(initValue) { var fba_obj = { // 原有构建fba_obj的代码保持不变 } initValue.products.forEach((item, i) => { // 原有遍历拼接参数的代码保持不变 }); console.log('call fba with data',fba_obj); // 新增:将回调包装为Promise返回 return new Promise((resolve, reject) => { amazonMws.fulfillmentOutboundShipment.create(fba_obj, function (error, response) { console.log('error',error); console.log('fba response',response); if (error) { console.log('error ', error); return reject(error); } console.log('reached end of'); resolve(response); }); }); }
步骤2:改造路由逻辑,等待异步任务完成后再返回响应
将index.js的路由处理函数改为async函数,等待fba逻辑执行完成后再发送响应:
app.post('/*', async function(req, response){ r = req.path.split('/'); console.log(`./${r[1]}/${r[2]}.js`) try { // 等待异步业务逻辑执行完成 await require(`./${r[1]}/${r[2]}.js`)(req.body,req); } catch (err) { console.error('业务执行失败:', err) return response.status(500).send('处理失败'); } response.header("Access-Control-Allow-Origin", "*"); response.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS"); response.header("Access-Control-Allow-Headers", "Origin, X-Requested-With," +" Content-Type, Accept"); response.send(req.body); });
额外排查项
如果修改后仍有问题,检查两项配置:
- Lambda是否配置了公网访问权限:如果Lambda放在VPC内,需要绑定NAT网关才能访问外网MWS接口,否则会出现请求超时无返回
- 部署包是否包含完整依赖:确认部署时
amazon-mws依赖没有被排除在部署包外,可在fba.js开头添加日志console.log('模块加载校验:', !!amazonMws?.fulfillmentOutboundShipment)确认模块正常加载
内容的提问来源于stack exchange,提问作者sd1sd1
相关产品推荐
相关产品推荐

