javascript - Expressjs:如何使用多个查询字符串正确搜索?
问题描述
我编写了一个名为 filterSearch 的函数,它不受管理员保护,它根据多个搜索/查询参数返回资源。基于状态的第一次搜索效果很好,但 if 语句中的其他搜索没有按预期工作。
这是路线
carRouter.get('/car', filterSearch, verifyToken, isAdmin, fetchAllCarAds);
这些是各自的 SQL 查询
export const statusQuery = 'SELECT * FROM cars WHERE status = $1';
export const statusPriceQuery = 'SELECT * FROM cars WHERE status = $1 AND price >= $2 AND price <= $3';
export const statusManufacturerQuery = 'SELECT * FROM cars WHERE status = $1 manufacturer = $2';
export const bodyTypeQuery = 'SELECT * FROM cars WHERE bodytype = $1';
export const statusStateQuery = 'SELECT * FROM cars WHERE status = $1 AND (state = $2 OR state = $3)';
我使用了不同的控制语句,例如 else if,但它仍然不起作用。
static async filterSearch(req, res, next) {
//console.log('req1', typeof req.query);
if (req.query.status || req.query.bodytype) {
//console.log('req2', req.query);
let { status, minprice, maxprice, bodytype, state, manufacturer } = req.query;
//console.log('req3', typeof bodytype);
try {
//status
status = status.trim().toLowerCase();
if (status && !minprice && !maxprice) {
const { rows, rowCount } = await db.query(statusQuery, ['unsold']);
if (rowCount === 0) {
return res.status(404).json({
status: 404,
error: 'Sorry, this does not exist'
});
}
return res.status(200).json({
status: 200,
data: rows
});
}
//status and price
if (status && minprice && maxprice) {
minprice = Number(minprice.trim());
maxprice = Number(maxprice.trim());
const { rows, rowCount } = await db.query(statusPriceQuery, ['unsold', minprice, maxprice]);
console.log('row', rowCount);
if (rowCount === 0) {
return res.status(404).json({
status: 404,
error: 'There is no result for your search now'
});
}
return res.status(200).json({
status: 200,
data: rows
});
}
//status and state(new/used)
if (status && state) {
state = state.trim().toLowerCase();
const { rows, rowCount } = await db.query(statusStateQuery, ['unsold', 'new', 'used']);
if (rowCount === 0) {
return res.status(404).json({
status: 404,
error: 'Search request is unavailable at the moment'
});
}
return res.status(200).json({
status: 200,
data: rows
});
}
// status and manufacturer
if (status && manufacturer) {
manufacturer = manufacturer.trim().toLowerCase();
const { rows, rowCount } = await db.query(statusManufacturerQuery, ['unsold', manufacturer]);
console.log('qui');
if (rowCount === 0) {
return res.status(404).json({
status: 404,
error: 'Something just happen right now'
});
}
return res.status(200).json({
status: 200,
data: rows
})
}
//bodyType
if (bodytype) {
//Here I get 'Cannot read property 'trim' of undefined'
bodytype = bodytype.trim().toLowerCase();
const { rows , rowCount } = await db.query(bodyTypeQuery, [bodytype]);
if (rowCount === 0) {
return res.status(404).json({
status: 404,
error: 'your search returned no result'
});
}
return res.status(200).json({
status: 200,
data: rows
});
}
return res.status(404).json({
status: 404,
error: 'There seems to be an issue with your search'
});
}
catch(error) {
return res.status(500).json({
status: 500,
error: error.message
});
}
}
next();
}
- 我希望我应该能够根据指定的查询字符串(如果提供)进行搜索,但是当我尝试按“bodytype”搜索时,我得到“无法读取未定义的属性 'trim”。
- 当某些查询参数不存在时,它应该返回“您的搜索似乎有问题或 404”,但它会继续获取所有受管理员保护的汽车。
解决方案
我解决了这个问题。我所要做的就是将函数分解成位以适应提供的每个查询搜索/术语。
推荐阅读
- docker - 在 Dockerfile 中运行 sqlcmd
- android - 使用 Linking.openURL(React 本机)时,较新版本的 android 中缺少短信正文
- r - 使用 perturb 包的连续变量和分类变量的条件索引
- active-directory - MS Adal 数据适用于个人 live.com 帐户,但前端 + 护照应用程序 + 注册应用程序仅配置 B2B
- spring-boot - 构造函数的参数 0 需要一个找不到类型的 bean
- python - 如何将值插入到新创建的空数据框的列中?
- pandas - 将 dict 从 CSV 附加到 Dataframe 正在删除值
- android - 在活动及其片段之间共享视图模型不是在活动中调用可观察的
- css - 如何使用 calc() 和 postCSS 变成负值?
- angular - 角度模板迭代数组或显示单个元素