mysql - 如何在 REST 服务器(NodeJS、MySQL)的 PUT 方法中传递正确的参数
问题描述
我正在用 RESTful 实现一个简单的高分板,服务器使用 NodeJS 和 MySQL。我在实现 PUT 方法时遇到了问题,而其他方法(GET、POST、DELETE ...)在客户端和 POSTMAN 中都像我预期的那样运行良好。
在 MySQL 中,我创建了一个只有 2 个值的表,即“用户名”和“分数”。
这是我的路线代码:
'use strict';
module.exports = function(app) {
let userCtrl = require('./controllers/UserControllers');
// routes
app.route('/users')
.get(userCtrl.get)
.post(userCtrl.store);
app.route('/users/:username')
.get(userCtrl.detail)
.put(userCtrl.update)
.delete(userCtrl.delete);
app.route('/leaderboard')
.get(userCtrl.top);
};
这是我的控制器源代码:
'use strict';
const util = require('util');
const mysql = require('mysql');
const db = require('./../db.js');
module.exports = {
get: (req, res) => {
let sql = 'SELECT * FROM leaderboard';
db.query(sql, (err, response) => {
if (err) throw err;
res.json(response);
});
},
store: (req, res) => {
let sql = 'INSERT INTO leaderboard SET ? ';
// sql = 'INSERT INTO leaderboard_log SET '
let data = req.body;
db.query(sql, [data], (err, response) => {
if (err) throw err;
res.json({message: 'Insert success!'});
});
},
// the 'update' here works well in POSTMAN
update: (req, res) => {
let sql = 'UPDATE leaderboard SET ? WHERE username = ?';
let data = req.body;
let username = req.params.username;
db.query(sql, [data, username], (err, response) => {
if (err) throw err;
res.json({message: 'Update success!'});
});
}
};
javascript中的客户端使用PUT方法
function httpPut(theUrl, data, callbackSuccess, callbackError) {
$.ajax({
type: "PUT",
url: theUrl,
success: callbackSuccess,
error: callbackError,
dataType: "json",
crossDomain: true
});
}
// how to pass the params 'username, 'newScore' to httpPUT ?!?
function updateUser(username, newScore) {
let data = {};
data['username'] = username;
data['score'] = newScore;
httpPut(URL_PUT_USER + username, data, function(data) {
// success
console.log("success update");
}, function(data) {
// fail
console.log("update error");
});
}
问题是功能
updateUser(用户名, newScore)
我不知道如何传递参数,以便update: (req, res)能够理解。
请注意,我使用 POSTMAN 测试了更新记录,并且update: (req, res)效果很好。
任何帮助表示赞赏。谢谢!。
PS:这是服务器上的错误:
simple_leaderboard\node_modules\mysql\lib\protocol\Parser.js:80
throw err; // Rethrow non-MySQL errors
^
解决方案
PUT
映射到store
操作,您的 sql 定义为:
let sql = 'INSERT INTO leaderboard SET ? ';
这不是有效的 SQL 插入语句。
你可能想要:
let sql = 'INSERT INTO leaderboard(username, data) VALUES(?, ?)';
let username = req.params.username;
let data = req.body;
db.query(sql, [username, data], ...
推荐阅读
- swift - 关于金属中的加法处理
- c - 如何将根文件中的函数包含在子文件中?
- testing - 如何配置 cypress-sql-server 以在不同的环境 prod 和 dev 中使用
- amazon-web-services - AWS AMP:502 错误网关:无法代理请求 - WebIdentityErr:检索凭证失败
- azure - 具有内置身份验证的前门 + 应用服务不起作用
- python - 如何防止我的主窗口在 python 和 Tkinter 中使用 Toplevel 窗口运行?
- bash - 更改 shell 脚本中的全局变量
- swiftui - 长按删除核心数据行
- java - java中的静态变量和方法在哪里加载?
- serilog - 应用配置 xml 中的 Serilog 应用洞察接收器配置