详解Angular调试技巧之报错404(not found)


Posted in Javascript onJanuary 31, 2018

序言

放假期间,学生忙着充电,学习“全栈开发”的不在少数,我时常收到读者的反馈,在调试《全栈开发之道》一书的实例时,遇到困惑。 尽管会遇到各种各样的问题,但总体来讲,可以归结为一个技术点,那就是—— Angular的调试。

编写Angular 代码并不难,难的是调试Angular代码。对于Angular新手来说,调试Angular需要一个过程,并在这个过程中不断积累经验,一看到报错,就能八九不离十猜出问题出在什么地方。

这篇文章,我们先来从常见的Angular调试技巧讲起,如果遇到404 (not found)报错,将怎么办?

模拟一个调试场景

《全栈开发之道》一书的实例 6.3.3 章节——单页面应用的实现,要实现这样的一个效果,如图所示:

详解Angular调试技巧之报错404(not found)

单页面应用效果

当点击 Home、About 、 Contact 时,下方的内容会相应地发生变化,而不需要页面发送一个新的请求。 单页面应用就是在一个页面内自动发生变化,也不用来回地跳转到新的页面,用户体验大大提升。

为了实现这样的单页面应用,书中创建了html文件(index.html、home.html、about.html、contact.html), 还有一个 myapp.js 用于router 和 controller, 并创建了应用程序的入口server.js

按照书上的教程,一步步完成代码的输入, 直到最后运行 node server.js 时,发现点击 Home、About、Contact 按钮时,下方的内容没有发生变化。 代码是没有问题的,这又是是怎么回事呢?

调试技巧

友情提示:

在调试 Angular时,一定要用 Chrome 浏览器。这一点很容易理解,Angular 是Google 家,Chrome 也是Google 家的,毫无疑问,Chrome 对自家的产品是支持的最好的。

在终端窗口运行 node server.js

在Chrome 浏览器中,输入: http://localhost:3000

此时,打开Chrome 浏览器的开发工具, 如果是Wiindows 系统,用F12键; 如果是Mac 系统,用 Option+Command+I ,这里的截图以Mac 系统为例。

详解Angular调试技巧之报错404(not found)

Angular 报错提示

先来看第一行错误,很多时候,第二行错误是第一行引起的;如果第一个错误解决了,下面的报错会自动消失。

http://localhost:3000/myapp.js 404 (Not Found)

在网络术语中,404 的意思是,你要请求的文件不存在。 这在传统的开发环境中,比如C、Java,即便文件找不见,也不会出现 404 错误。 再看接下来的提示 Not Found, 意思是没找见。

报错排查方法

遇到这种报错,排查的方法是,先看这个文件是否存在,再看它的访问路径是否正确。

(1)确认该文件是否存在。 文件名必须严格一致,文件名本身不用区分大小写。 比如: index.html 与 Index.html 是同一个文件, myapp.js 与 myApp.js 也是一回事。

(2)排查文件的路径。 排查文件名是否正确,这事简单; 而排查文件的路径,就是一个技术活儿了。 为什么这么说呢? 这是因为,在AngularJS中,有一个静态资源的概念。myApp.js文件分明是存在的,为何找不见呢? 先来看引用myApp.js 的那行代码。

在index.html 的 <head> 标签中:

<script src="myapp.js"></script>

引用一个文件时,要么给出绝对路径,要么给出相对路径,myapp.js 的文件路径是怎么约定的呢?

这要看 server.js 文件是怎么规定的路径约定,代码如下:

app.use(express.static(path.join(__dirname, 'public')));

__dirname是一个路径,它是指当前文件(server.js)所在的路径,而public 是__dirname的下一级目录。 path.join 是一个规定的表单式,express.static 表示该应用程序指定的 静态资源存放的位置。

按照这个概念,上面的 home.html 、 about.html、 contact.html、myapp.js 四个文件都是静态资源文件,再来审视这行代码:

<script src="myapp.js"></script>

代码这么写时,应用程序要在当前路径的 public 目录遍历 myapp.js 文件。 读到这里,你就明白报错404 的原因所在了吧。
需要把这些静态资源文件,统一放在public 文件夹下,如图所示。

详解Angular调试技巧之报错404(not found)

静态资源文件路径

进一步讨论

既然是路径惹的祸,那么能不能换一种思路,改一下静态资源路径的设置呢? 比如,修改server.js 文件的代码,如下:

app.use(express.static(path.join(__dirname, '/')));

这样一来,上面那四个文件就不用放到public了, 这种方法,虽然没有报错,问题是,这不是规范的做法。但凡稍微复杂一点的应用,都会用到大量的静态资源文件,如果不分配路径,将难以维护!

小结

掌握一门编程技术, 仅仅会编写代码是不够的。 评价一个人的编程水平,就看他的调试技能是否驾轻就熟。 后续,我要借助一些 Angular专用的调试工具,模拟一些出现bug的场景,看看如果快速发现root cause,并给出解决方案。

总之,掌握Angular的调试技能,是通往高级全栈工程师的阶梯!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
Apr 27 Javascript
探讨jQuery的ajax使用场景(c#)
Dec 03 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
Dec 20 Javascript
jQuery AjaxUpload 上传图片代码
Feb 02 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 Javascript
Javascript的console['']常用输入方法汇总
Apr 26 Javascript
详解vue+webpack+express中间件接口使用
Jul 17 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
Jan 18 jQuery
使用vue完成微信公众号网页小记(推荐)
Apr 28 Javascript
微信小程序slider组件使用详解
Jan 31 #Javascript
vue项目实现记住密码到cookie功能示例(附源码)
Jan 31 #Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
Jan 31 #Javascript
微信小程序progress组件使用详解
Jan 31 #Javascript
微信小程序button组件使用详解
Jan 31 #Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 #Javascript
微信小程序模板(template)使用详解
Jan 31 #Javascript
You might like
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP JSON 数据解析代码
2010/05/26 PHP
PHP图片加水印实现方法
2016/05/06 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
浅谈Python 中整型对象的存储问题
2016/05/16 Python
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
python解决字符串倒序输出的问题
2018/06/25 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
祖国在我心中演讲稿500字
2014/05/04 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python
基于Redission的分布式锁实战
2022/08/14 Redis