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
可能跟 这个问题有关,
我也遇到这个问题:
“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云函数中:
- 连接未复用:每次调用都重新创建MySQL连接,在高并发时容易耗尽连接资源
- 异常处理不完善:catch块中只打印日志,没有返回错误信息,导致调用方无法获知具体错误
- 连接关闭时机不当:在异步操作完成后立即关闭连接,可能在某些情况下提前终止
建议优化方案:
// 使用连接池替代单连接
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);
}
});
});
});
};

