几天来我一直在尝试设置rest API。我一直在关注一个出色的教程,该教程确实帮助我了解了这些工作原理的很大一部分(发送请求,获取响应等)。但是,它使用MongoDB和Mongoose。我正在使用MySQL。我的表和视图有点复杂,所以我决定不使用ORM,而是使用mysql2程序包自己进行查询。目前,我坚持尝试PATCH
和PUT
。我前端的一部分功能是有时仅发送1或2个需要更新的字段(从我收集到的所有内容中获取PATCH
)。因此,我使用了MongoDB和Mongoose教程的一部分来构建对象数组并将它们传递到connection.query
中。这是我的补丁路线:
router.patch('/:txnid', (req, res, next) => { //UPDATE fields that are passed
const txnid = req.params.txnid;
for (const field of req.body) {
fieldsToUpdate[field.name] = field.value;
}
connection.query("UPDATE QuoteToClose SET ? WHERE qb_TxnID = '" + txnid + "'", { fieldsToUpdate }, function (error, results) {
if (error) {
res.status(404).json({
message: error,
field: fieldsToUpdate
});
} else {
res.status(201).json({
"record_count" : results.length,
"error": null,
"response": results
});
}
});
});
有时候我会传递1个字段,有时会传递2个。在这种情况下,我只会传递1个。我在POSTMAN中建立我的身体,并使用PATCH请求将其发送:
[
{
"name": "margin",
"value": "50"
}
]
当我通过POSTMAN运行此程序时,出现错误:
{
"message": {
"code": "ER_BAD_FIELD_ERROR",
"errno": 1054,
"sqlState": "42S22",
"sqlMessage": "Unknown column 'fieldsToUpdate' in 'field list'"
},
"field": {
"margin": "50"
}
}
我不确定为什么。不幸的是,我没有使用Mongoose,所以我不知道是否缺少依赖于它的东西。我的身体解析器设置如下:
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
我想动态构建该查询,而不是指定每个字段(这样看起来更干净。
答案 0 :(得分:1)
您好,我正在使用此库来构建动态查询。https://www.npmjs.com/package/flexqp
let result = await qp.executeUpdatePromise('update user set ? where user.id = ?', [user, user.id], dbconfig);
用户是一个包含许多子元素的对象,该库将自动填充
查询到例如更新用户集名称='xxx',地址='xxx'..etc,其中user.id = 1
答案 1 :(得分:0)
fieldsToUpdate已经是一个对象。如果您在参数化时移除了冰壶,那么是否应该行得通:
connection.query("UPDATE QuoteToClose SET ? WHERE qb_TxnID = '" + txnid + "'", fieldsToUpdate,
此外,作为一个侧面说明,字符串连接不是一个好主意,您只是在请求SQL注入攻击。