如何用NodeJS和Postman执行MySQL 9.0的JavaScript存储函数?
问题排查与修复方案
你的代码存在几个关键问题,导致无法正确获取求和结果,以下是逐一修复的步骤:
1. 修正路由引入与请求体解析
try是JavaScript关键字,不能用作变量名,需修改路由文件的引入方式- Express默认不会解析JSON请求体,需添加
express.json()中间件才能读取req.body的内容
修正后的index.js:
const express = require('express'); const cors = require('cors'); const connection = require('./db/connection'); // 修正变量名,避免使用关键字 const sumRouter = require('./try'); const app = express(); app.use(cors()); // 添加JSON请求体解析中间件 app.use(express.json()); // 使用正确的路由变量 app.use('', sumRouter); app.listen(3000, "localhost", () => { console.log("Server is running on port 3000"); });
2. 修正SQL函数调用逻辑
你创建的自定义函数名为MySum,但SQL语句里误用了MySQL内置的sum()聚合函数,同时需要给结果字段设置别名,避免解析动态字段名的问题。
修正后的try.js:
const express = require('express'); const router = express.Router(); const connection = require('./db/connection'); router.post('/sum', (req, res) => { const {num1, num2} = req.body; if(!num1 || !num2){ return res.status(400).json({ error: 'The numbers are required' }); } else { // 调用自定义的MySum函数,添加别名total_sum const sql = "SELECT MySum(?, ?) AS total_sum"; const values = [num1, num2]; connection.execute(sql, values, (err, results) => { if (err) { // 返回具体错误信息便于调试 return res.status(500).json({ error: 'Error while executing the function', detail: err.message }); } else { // 通过别名获取结果 res.status(200).json({ message: `The sum is ${results[0].total_sum}` }); } }); } }); module.exports = router;
3. 确认MySQL社区版的JavaScript功能支持
MySQL 9.0开始,社区版正式引入了基于GraalVM的JavaScript存储程序功能,无需企业版。但需确保你的MySQL实例已启用相关组件:
- 检查
mysql-js插件是否已加载:执行SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'mysql_js'; - 如果未加载,可执行
INSTALL PLUGIN mysql_js SONAME 'mysql_js.so';(Linux)或INSTALL PLUGIN mysql_js SONAME 'mysql_js.dll';(Windows)加载插件
额外调试建议
- 在Postman请求时,确保请求体使用
raw -> JSON格式,传入{"num1": 1, "num2": 2}这样的有效数据 - 查看Node.js控制台的错误日志,以及MySQL的错误日志,定位具体执行问题
内容的提问来源于stack exchange,提问作者user26627078
相关产品推荐
相关产品推荐

