如何在Node.js+OMDB API中搜索无效电影时显示错误
解决OMDB API电影搜索应用的无效搜索错误问题
我明白你碰到的问题了——当用户搜索不存在或拼写错误的电影时,OMDB API返回的结果里没有Search字段,这直接导致你的results.ejs模板在尝试调用data["Search"].forEach()时抛出TypeError,因为data["Search"]是undefined。下面是完整的解决方案:
第一步:完善后端的API响应判断逻辑
先修改app.js里的/results路由,不仅要处理请求层面的网络错误,还要校验API返回的业务结果:
var express = require('express'); var app = express(); var request = require('request'); var _und = require('underscore'); app.set("view engine", "ejs"); // Search Route app.get("/", function(req, res) { res.render("search", { warning: null }); // 初始化warning为null,避免模板报错 }); // Result Route app.get("/results", function(req, res) { var query = req.query.search; var url = "http://www.omdbapi.com/?apikey=6cf73f27&s=" + query; request(url, function(error, response, body) { // 处理请求层面的错误(比如网络故障、API服务器无响应) if(error || response.statusCode !== 200) { return res.render("search", { warning: "无法连接到电影数据库,请稍后重试" }); } var data = JSON.parse(body); // 处理业务层面的错误:API返回Error字段,或Search不存在/为空数组 if(data.Error || !data.Search || data.Search.length === 0) { return res.render("search", { warning: "未找到匹配的电影,请检查拼写后重试" }); } // 有效搜索结果,渲染results页面 res.render("results", { data: data }); }); }); app.listen(9090, function() { console.log("Movie App has started!!!.....Ctrl+C to Exit....."); });
第二步:在搜索页面添加错误提示展示
修改你的搜索页面模板(search.ejs),添加代码来显示后端传递的警告信息:
<h1>电影搜索</h1> <!-- 错误提示区域 --> <% if (warning) { %> <div style="color: #dc3545; padding: 10px; background-color: #f8d7da; border-radius: 4px; margin-bottom: 15px;"> <%= warning %> </div> <% } %> <form action="/results" method="GET"> <input type="text" name="search" placeholder="输入电影名称..." required> <button type="submit">搜索</button> </form>
第三步:给结果模板添加兜底判断(可选但推荐)
为了避免后续再出现类似的未定义错误,你可以在results.ejs里添加一个兜底判断,确保data.Search存在时才执行遍历:
<h1>Result:</h1> <% if (data.Search && data.Search.length > 0) { %> <ul> <% data["Search"].forEach(function(movie) { %> <li><strong><%= movie["Title"] %></strong> - <%= movie["Year"]%></li> <% }) %> </ul> <% } else { %> <p>未找到任何匹配的电影</p> <% } %> <a href="/">Search again!</a>
这样修改后,当用户搜索无效电影时,会直接跳转回搜索页面并显示清晰的错误提示,再也不会抛出TypeError了。
内容的提问来源于stack exchange,提问作者Mg Buthee
相关产品推荐
相关产品推荐

