uni-app 云函数经常502: {"errorMessage":"Process exited unexpectedly before completing request"}

uni-app 云函数经常502: {“errorMessage”:“Process exited unexpectedly before completing request”}

信息类型 详情
产品分类 uniCloud/App

示例代码:

云函数 pay_baidu.js

'use strict';  

exports.main = async function (event,context) {  

const db = uniCloud.database()  

    let callFunctionResult = await uniCloud.callFunction({  
        name: "write-tradeno-mysql",  
        data: { out_trade_no: outTradeNo }  
    })  

    if(callFunctionResult){  

        return {  
            orderInfo  
        }  
    }  

}

云函数 write-tradeno-mysql

'use strict';  

var mysql = require('mysql');  
var connection = mysql.createConnection({  
  host: '',  
  user: '',  
  password: '',  
  database: '',  
  port: 3306  
});  
/**  
 * 封装mysql执行操作为Promise  
 *   
 * @param {Object} sql  
 * @param {Object} values  
 */  
const query = function(sql, values) {  
  return new Promise((resolve, reject) => {  
    connection.query(sql, values, (error, results, fields) => {  
      if (error) {  
        reject(error)  
      } else {  
        resolve(results)  
      }  
    })  
  })  
}  

exports.main = async (event, context) => {  

  try {  
    //连接数据库  
    connection.connect()  

    // 新增记录  
    let addRes_order = await query('insert into order set ?', {  
      body : '',  
      client: '',  
      out_trade_no : event.out_trade_no  
    })  

if(addRes_order.insertId >0)  
{  
    let addRes_pay_info = await query('insert into pay_info set ?', {  
       order_id : addRes_order.insertId,  
       openid: ' ',  
          pay_status  : 'SUCCESS'  
     })  

}  

    //查询记录  

    //关闭连接  
    connection.end();  
  } catch (e) {  
    console.log('操作失败,失败信息 ', e);  
  }  

  //返回数据给客户端  
  return true  
};

操作步骤:

调用 pay_baidu.js 时不时就会 502

预期结果:

调用 pay_baidu.js 时不时就会 502

实际结果:

调用 pay_baidu.js 时不时就会 502

bug描述:

[pay_baidu/ac140d3c1616042554825556474/1579ms/ERROR] errCode: FunctionCommonError | errMsg: 502:{“errorMessage”:“Process exited unexpectedly before completing request (duration: 3ms, maxMemoryUsage: 41.96MB)”}

Error: errCode: FunctionCommonError | errMsg: 502:{“errorMessage”:“Process exited unexpectedly before completing request (duration: 3ms, maxMemoryUsage: 41.96MB)”}

at e.$scope.function.invoke.then.catch.e (/tmp/function/@dcloudio/serverless/lib/aliyun/uni-cloud.js:1:48840)

at <anonymous>

at process._tickCallback (internal/process/next_tick.js:188:7)

请求响应状态: fail

云函数 调用了 另一个 连接 mysql 的云函数插件 var connection = mysql.createConnection({

云函数连接Mysql数据库示例
https://ext.dcloud.net.cn/plugin?id=1925

报错的 云函数如下:


更多关于uni-app 云函数经常502: {"errorMessage":"Process exited unexpectedly before completing request"}的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

可能跟 这个问题有关,
我也遇到这个问题:
“Cannot enqueue Query after invoking quit”
请问 怎么改 插件的 代码 参考:解决方法: https://forums.aws.amazon.com/thread.jspa?threadID=223230
const query = function(sql, values) { return new Promise((resolve, reject) => { connection.query(sql, values, (error, results, fields) => { if (error) { reject(error) } else { resolve(results) } }) }) }
//This is your handler. exports.handler=function(event, context) { //This is declared inside the handler: it is guaranteed to never be reused!. var connection=function_that_gets_your_connection();
//Do things with your connection. var query_string=‘SELECT something FROM nothing WHERE value=?’;
connection.query(query_string, [beware], function(res, err){
//Check for errors, disconnect and exit with failure.
if(err){
console.log(“Query failed”, err);
connection.end(function(err){
context.fail(0);
});
}
//Disconnect and exit with success.
else{
connection.end(function(err){

    if(err){  
        console.log("Warning: disconnection failed"; err);  
    }  

    context.succeed(res);  
});  

}
}); }
diamont1001@163.com 2020-08-01
query 这个方法有点问题:
另外,我遇到了一个问题,50%的机率会报这个错“Cannot enqueue Query after invoking quit”,解决方法: https://forums.aws.amazon.com/thread.jspa?threadID=223230

更多关于uni-app 云函数经常502: {"errorMessage":"Process exited unexpectedly before completing request"}的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个502错误主要是由于云函数连接MySQL时没有正确处理连接生命周期导致的。问题出现在write-tradeno-mysql云函数中:

  1. 连接未复用:每次调用都重新创建MySQL连接,在高并发时容易耗尽连接资源
  2. 异常处理不完善:catch块中只打印日志,没有返回错误信息,导致调用方无法获知具体错误
  3. 连接关闭时机不当:在异步操作完成后立即关闭连接,可能在某些情况下提前终止

建议优化方案:

// 使用连接池替代单连接
const mysql = require('mysql');
const pool = mysql.createPool({
  host: '',
  user: '',
  password: '',
  database: '',
  port: 3306,
  connectionLimit: 10
});

exports.main = async (event, context) => {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      if (err) {
        reject(err);
        return;
      }
      
      // 执行数据库操作
      connection.query('insert into order set ?', {
        body: '',
        client: '',
        out_trade_no: event.out_trade_no
      }, (error, results) => {
        connection.release(); // 释放连接回连接池
        
        if (error) {
          reject(error);
        } else {
          resolve(true);
        }
      });
    });
  });
};
回到顶部