使用Express.js中的Sequelize ORM查询mySQL数据库。
在Express.js中,我有一个端点,它带有两个参数“ level”和“ topic”,就像这样,
//Get Topic
router.get("/tasks/:level&:topic", (req, res) => {
Task.findAll({
where: {
Topic: req.params.topic,
Level: req.params.level
}
})
.then(tasks => {
res.json(tasks)
})
.catch(err => {
res.send("error: " + err)
})
})
当我想查询“级别AND主题”时,此方法很好用。
但是有时“级别”可能为空,而我只想查询“主题”,而有时“主题”可能为空,而我只想查询“级别”。
我希望在此终结点中有很多参数,而不仅仅是这里的两个参数,并且能够查询这些参数的任何组合。
我想象如果不可能的话,我将不得不为每种参数组合创建一个端点。有更简单的方法吗?
任何帮助将不胜感激。
谢谢
答案 0 :(得分:1)
如果它的查询简单field= value
,那么您可以使用下面的查询
在这种情况下
在以下情况下,您必须保持参数名称与数据库字段名称相同
router.get("/tasks/:Level&:Topic", (req, res) => { //<--- CHANGE
Task.findAll({
where : req.params //<--- CHANGE
})
.then(tasks => {
res.json(tasks)
})
.catch(err => {
res.send("error: " + err)
})
})
其他选择是检查
req.params
并进行/创建where
查询 根据您的需要
答案 1 :(得分:0)
我通过创建一个称为查询的对象来完成这项工作,该对象根据元素是否为空而添加了元素。
然后我将此对象用作查询中的“ where”条件,
//Get Query
router.get("/tasks/:level?/:topic?", (req, res) => {
var query = {};
if (req.params.topic != " ") {
console.log("topic sent");
query.Topic = req.params.topic;
}
if (req.params.level != " ") {
console.log("level sent");
query.Level = req.params.level;
}
console.log(query);
Task.findAll({
where: query
})
.then(tasks => {
res.json(tasks)
})
.catch(err => {
res.send("error: " + err)
})
})
在Vue.js中,使用此方法发送参数,
getQuery(level, topic) {
if (!topic) {
topic = " ";
}
if (!level) {
level = " ";
}
axios.get("/api/tasks/" + level + "/" + topic + "/").then(
// axios.put('/api/task/' + id, {
result => {
console.log(result.data)
this.todos = result.data
},
error => {
console.error(error)
}
)
},
这将使我能够处理来自端点的参数的任何组合。]
“?”在我在此帖子https://stackoverflow.com/a/41736911/4001324中找到的网址中,该网址允许参数为可选。尽管它们总是在此处传递,但如果为空则为空格。