Node.js/Express中函数在服务器外调用时return语句为何异常?
问题原因与修复方案
问题原因
你在forEach的回调函数里写的return true,只能终止当前这一次的回调执行,不会影响外层的postExist函数。外层函数会继续跑完整个forEach循环,之后执行return false,所以最终返回值是false。
修复方案
方案1:使用Array.some()
some方法会在遍历过程中找到第一个符合条件的元素时立即停止遍历,并返回true;如果遍历完所有元素都没找到匹配项,返回false,正好符合你的需求:
const Lodash = require("lodash") module.exports.postExist = function(posts, req) { const targetName = Lodash.lowerCase(req.params.postName.toLowerCase()); return posts.some(post => { const postTitle = Lodash.lowerCase(post.title.toLowerCase()); if (targetName === postTitle) { console.log(post + "inside"); return true; } return false; }); }
方案2:使用Array.find()
如果需要同时获取匹配的post对象,可以用find方法,它会返回第一个匹配的元素,没有则返回undefined:
const Lodash = require("lodash") module.exports.postExist = function(posts, req) { const targetName = Lodash.lowerCase(req.params.postName.toLowerCase()); const matchedPost = posts.find(post => { const postTitle = Lodash.lowerCase(post.title.toLowerCase()); return targetName === postTitle; }); if (matchedPost) { console.log(matchedPost + "inside"); return true; } console.log("outside"); return false; }
方案3:使用普通for循环
普通for循环里的return可以直接终止外层函数,逻辑和你原来的写法最接近:
const Lodash = require("lodash") module.exports.postExist = function(posts, req) { let postValue = [] const targetName = Lodash.lowerCase(req.params.postName.toLowerCase()); for (let i = 0; i < posts.length; i++) { const post = posts[i]; const postTitle = Lodash.lowerCase(post.title.toLowerCase()); if (targetName === postTitle) { postValue = post; console.log(postValue + "inside"); return true; } } console.log("outside"); return false; }
内容的提问来源于stack exchange,提问作者roblov Cave
相关产品推荐
相关产品推荐

