我正在使用Express中的API来过滤JSON文件,该文件包含使用路由发送的查询字符串的事件。
我的JSON文件具有以下结构
{ "events": [
{
"venue": {
"name": "Name of Venue",
"address": "Address of Venue
}
}]
}
我想在QueryString中放置场地名称并过滤对象,所以像这样
app.get('/api/events', function(req, res){
var response = [];
const { venue=null } = req.query;
console.log(req.query);
if (venue) {
eventdata.filter((event) => {
if(event.venue.name === venue){
response.push(event);
}
});
}
// in case no filtering has been applied, respond with all venues
if(Object.keys(req.query).length === 0){
response = eventdata;
}
res.json(response);
});
但我认为,因为场地名称在对象的2层深处,所以没有创建匹配。我收到错误
Cannot read property 'name' of undefined
如果我没有输入查询字符串,我会得到所有结果。
如果我使用localhost:3000 / api / events?venue = abc%20bar我收到错误。
我猜测它与"名称"的深度有关。 JSON中的键/值对,但我不确定。即行
if(event.venue.name === venue)
有什么想法吗?感谢
答案 0 :(得分:0)
**if(event.venue && event.venue.name) {
}**
您可以进行嵌套检查,以免遇到错误(无法读取未定义的名称)
答案 1 :(得分:0)
那不是filter
的工作方式。里面的函数应该返回一个布尔值,表示是否应保留该元素。
类似
var response = eventdata.filter((evt) => {
return evt.venue && evt.venue.name && evt.venue.name == venue;
});