如何设置Express API端点以根据URL参数返回动态响应



我正在处理一个react管理项目,该项目涉及通过数据提供程序连接到express服务器。

我一直无法使排序或分页工作,我知道我必须对我的API快速响应进行更改才能使这些功能工作。

我编写了下面的代码来检测sort参数发送的内容,希望我可以根据sort URL得到不同的API响应。

我一直很难让排序和分页功能发挥作用。如果可以的话,请帮忙!TY

usersRouter.get("/", addRAHeader, checkJwt, async (req, res) => {
const user_id = req.query.sort
console.log(user_id)
if(req.query.sort === ["id","ASC"]) {
try {
connection.execute(
// getUsers,
getUsersASC,
function(err, users, fields) {
console.log("USERSDESC")
res.status(200).json(users)
}
)
} catch (err) {
res.json({message:err});
}
}
else if(req.query.sort === ["email","ASC"]) {
try {
connection.execute(
// getUsers,
getUsersASC,
function(err, users, fields) {
console.log("USERSASC")
res.status(200).json(users)
}
)
} catch (err) {
res.json({message:err});
}
} else {
try {
connection.execute(
// getUsers,
getUsersASC,
function(err, users, fields) {
console.log("USERSELSE")
res.status(200).json(users)
}
)
} catch (err) {
res.json({message:err});
}
}
});```

首先,您可以在单个查询变量排序中存储两个变量。您可以像/?sortBy=id&sortOrder=DESC一样设计queryParams

你的快递代码可能看起来像这个

usersRouter.get("/", addRAHeader, checkJwt, async (req, res) => {
const user_id = req.query.sort
const sortBy = req.query.sortBy
const sortOrder = req.query.sortOrder
//if(req.query.sort === ["id","ASC"]) {
if(sortBy === "id" && sortOrder === "ASC") 
try {
connection.execute(
// getUsers,
getUsersASC,
function(err, users, fields) {
console.log("USERSDESC")
res.status(200).json(users)
}
)
} catch (err) {
res.json({message:err});
}
}
// else if(req.query.sort === ["email","ASC"]) {
else if(sortBy === "email" && sortOrder === "ASC") {
try {
connection.execute(
// getUsers,
getUsersASC,
function(err, users, fields) {
console.log("USERSASC")
res.status(200).json(users)
}
)
} catch (err) {
res.json({message:err});
}
} else {
try {
connection.execute(
// getUsers,
getUsersASC,
function(err, users, fields) {
console.log("USERSELSE")
res.status(200).json(users)
}
)
} catch (err) {
res.json({message:err});
}
}
});

我能够解决这个问题。从概念上讲,我缺少的是react admin使用服务器端排序和分页。

一旦我意识到这一点,我只需在我的express API端点中编写一些代码,就可以正确地接收URL查询中的排序和过滤参数,然后我使用querybuilder函数创建一个反映这些参数的自定义MySQL查询。

usersRouter.get("/", addRAHeader, checkJwt,  async (req, res) => {   setTimeout(() => {
const { sort, range, filter } = req.query
if (filter || range || sort !== undefined) {
parsedFilter = JSON.parse(filter).q
parsedRange = JSON.parse(range)
lowerRange = parsedRange[0]
upperRange = parsedRange[1] + 1
parsedSort = JSON.parse(sort)
querySQL(queryBuilder(`${parsedSort[0]} ${parsedSort[1]}`, `${parsedRange[0]},${(upperRange - lowerRange)}`, parsedFilter), res)
} else {
querySQL(getUsers, res)
}   }, 1000) });
function queryBuilder (orderByParam, limit=10, filter='') {   const query = `SELECT * FROM users Where email like '%${filter}' ORDER BY ${orderByParam} LIMIT ${limit};`   // console.log("QueryBuilt:", query)   return query  }
let querySQL = (query, res) => {
try {
connection.execute(
query,
function(err, users, fields) {
res.status(200).json(users)
}
)
} catch (err) {
res.json({message:err});
}
}

以上这些功能的结合为我解决了这个问题

最新更新