mysql - 如何避免 FindAll 条件默认设置为 "undefined"

标签 mysql node.js reactjs sequelize.js

我创建了一个 web 应用程序来显示我数据库中的公司。我插入了两个过滤器来改进搜索:类型和国家。
我的问题是,当过滤器未设置查询时:
type = "undefined"& country = "undefined"被发送。
同样,如果您只设置一个过滤器,则另一个未定义,反之亦然。发送正确查询的唯一方法是设置所有过滤器以赋予它们一个值。
如何确保不考虑未设置的过滤器?
我的前端:

const handleFetchWithSearchParameters = () => {
TutorialDataService.findByParameters(searchParameters)             
.then(response => { setTutorials(response.data); 
console.log(response.data);             
})             
.catch(e => { console.log(e);             
});    }

return (
<Form.Control as="select"type="text"
required
value={searchParameters.searchCountry}
onChange={onChangeSearchCountry}
name="country">
  <option>Select Country</option>
  <option>Nigeria</option>
  <option>Ghana</option>
  <option>Kenya</option>
  <option>Senegal</option>
</Form.Control>
<Form.Control as="select"type="text"id="type"
requiredvalue={searchParameters.searchType}
onChange={onChangeSearchType}
name="type">

  <option>Select Type</option>    
  <option>Agricultural</option>    
  <option>Manufacturing</option>    
  <option>Industrial</option>        
  <option>Livestock</option>        
  <option>Service Industry</option>
 </Form.Control>
 <button type="button" onClick={handleFetchWithSearchParameters}>    
Search                      
</button>
Service.js:
const findByParameters = searchParameters
 => {const { searchType, searchCountry} = searchParameters;
return http.get(`/tutorials?type=${searchType}&country=${searchCountry}`); }; 
Controller.js:
exports.findAll = (req, res) => { 
const { type, country } = req.query;
let condition = (type || country) ?   
{type: type,
country: country,  
} : null; 

Tutorial.findAll({
where: condition,
order: [  ['createdAt', 'DESC']] })    
.then(data => {
res.send(data);    
})    .
catch(err=> {
res.status(500).send({message:err.message || "Some error occurred while retrieving tutorials."      
});    });};

最佳答案

在您的 service.js 中:

const findByParameters = searchParameters  => {
  const {
    searchType,
    searchCountry
  } = searchParameters;
  const params = new URLSearchParams();
  if (searchType)
    params.set('type', searchType);
  if (searchCountry)
    params.set('country', searchCountry);
  return http.get(`/tutorials?${params.toString()}`);
}
我不确定您使用的是哪个数据库,但我认为您可以切换:
let condition = (type || country) ?   
{type: type,
country: country,  
} : null; 
有了这个:
const condition = {};
if (type)
  condition.type = type;
if (country)
  condition.country = country;
在 controller.js 中。

关于mysql - 如何避免 FindAll 条件默认设置为 "undefined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64928512/

相关文章:

MYSQL导入(不同版本)

reactjs - Redux调用dispatch函数但不改变store

node.js - 带有 passportjs + Vue 的 Google oAuth

javascript - 我无法在 Material-UI 中编辑文本字段

node.js - Express 正则表达式路由不再知道如何加载静态资源

php - 验证后将数据插入数据库

sql - 在mysql中复制表的最快方法?

mysql - 如何根据最高值进行分组

json - 访问 webhook URL 时出现错误 "Action Error: no matching intent handler for: null"

javascript - 如何维护对正确对象的引用?