nodejs请求静态资源404错误,后台需处理返回http请求的静态资源

nodejs小白在做的demo时后台返回主页面html后,页面请求引用的js文件,后台没有返回对应请求路径的静态资源,所以报错。原来在java开发下没有注意过这种问题,一般除了WEB-INF下的文件不能访问外,其他资源文件都可以直接用http路径访问。

1.使用http模块处理(http模块时nodejs内置模块)

public文件夹下的文件js,html默认为静态资源,后台读取这些文件然后返回给前台。
 1 var http = require(‘http‘);
 2 var fs = require(‘fs‘)
 3 const path = require(‘path‘);
 4 const server = http.createServer((req,res)=>{
 5     res.statusCode=200;
 6     var pathurl=path.join(__dirname, req.url);
 7     var parseurl= path.parse(pathurl);
 8     var spliturls=path.normalize( req.url).split(path.sep)
 9     var html="";
10     if(spliturls.length>0&&spliturls[1]==‘public‘){
11         if(parseurl.ext==‘.js‘){
12             res.setHeader(‘Content-Type‘,‘text/plain‘);
13             html= fs.readFileSync(path.join(__dirname, req.url));
14         }else if(parseurl.ext==‘.html‘){
15             res.setHeader(‘Content-Type‘,‘text/html‘);
16             html= fs.readFileSync(path.join(__dirname, req.url));
17         }
18     }else{
19         res.setHeader(‘Content-Type‘,‘text/html‘);
20         html= fs.readFileSync(path.join(__dirname, ‘src/index.html‘));
21     }
22   res.end(html)
23 })
24 server.listen(‘3000‘,‘127.0.0.1‘,()=>{
25     console.log(`服务器运行在 http://127.0.0.1:3000/`);
26 })

2.使用express模块(nodejs的一个web框架,封装了http模块)

 1 var express = require("express");
 2 var app = new  express();
 3 const path = require(‘path‘);
 4 app.use(express.static(path.join(__dirname,‘public‘)))
 5 app.use(‘/‘,function(req,res){
 6     res.setHeader(‘Content-Type‘,‘text/html‘);
 7     var html= fs.readFileSync(path.join(__dirname, ‘src/index.html‘));
 8     res.end(html)
 9 })
10 app.listen(‘3000‘,‘127.0.0.1‘)

其中express.static是设置静态资源的目录,如果请求这个目录下的文件,则会返回对应文件。这里需要注意的是前台请求的文件路径如果是相对路径,则从public下面的文件开始,不包括public,否则取不到文件,然后又执行下面的use,返回的数据就不对了。

  测试项目的实际静态资源的路径: E:\mywv\testbb\public,其中testbb是项目名称,因此如果请求E:\mywv\testbb\public\index.js文件的http请求路径是http://127.0.0.1:3000/index.js,而不是http://127.0.0.1:3000/public/index.js。

原因:

express.static(path.join(__dirname,‘public‘))调用的是 serve-static/index.js中的

 1 function serveStatic (root, options) {
 2   if (!root) {
 3     throw new TypeError(‘root path required‘)
 4   }
 5
 6   if (typeof root !== ‘string‘) {
 7     throw new TypeError(‘root path must be a string‘)
 8   }
 9
10   ......此处省略部分代码.....
11   .......
12   // construct directory listener
13   var onDirectory = redirect
14     ? createRedirectDirectoryListener()
15     : createNotFoundDirectoryListener()
16
17   return function serveStatic (req, res, next) {
18     if (req.method !== ‘GET‘ && req.method !== ‘HEAD‘) {
19       if (fallthrough) {
20         return next()
21       }
22
23       // method not allowed
24       res.statusCode = 405
25       res.setHeader(‘Allow‘, ‘GET, HEAD‘)
26       res.setHeader(‘Content-Length‘, ‘0‘)
27       res.end()
28       return
29     }
30
31     var forwardError = !fallthrough
32     var originalUrl = parseUrl.original(req)
33     var path = parseUrl(req).pathname
34
35     // make sure redirect occurs at mount
36     if (path === ‘/‘ && originalUrl.pathname.substr(-1) !== ‘/‘) {
37       path = ‘‘
38     }
39
40     // create send stream
41     var stream = send(req, path, opts)
42
43    ......此处省略部分代码......
44     ...........
45
46     // pipe
47     stream.pipe(res)
48   }
49 }
调用express.static时,使用的serveStatic (root, options)函数,参数root为E:\mywv\testbb\public,创建发送流(send(req, path, opts)),然后在发送文件时stream.pipe(res).当前端请求路径是http://127.0.0.1:3000/public/index.js文件时,pipe输出文件使用的文件路径生成是有误的导致文件找不到。下图是stream.pipe输出文件时,文件路径的生成。

				
时间: 2024-10-31 22:58:29

nodejs请求静态资源404错误,后台需处理返回http请求的静态资源的相关文章

远程服务器返回错误: 404错误、远程服务器返回错误:500错误、 HttpWebResponse远程服务器返回错误:(404、500) 错误。

现象 我们编码实现请求一个页面时,请求的代码类似如下代码: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl);req.UserAgent = "MSIE6.0";req.Method = "GET";HttpWebResponse res = (HttpWebResponse)req.GetResponse();StreamReader sr = new StreamReader(res.G

spring mvc 静态资源 404问题

spring mvc 静态资源 404问题 在web.xml配置servlet-mapping的时候,如果url-pattern设置为"/" (如下),很多人都会遇到导入js,css,图片等静态资源出现Firefox调试窗口会报出的404错误,而你的确也不能访问那些资源 <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</u

vue-cli 项目中绝对路径引用的相关资源 npm run build 后 打开页面报404错误

在项目中.通过vue-cli 搭建的项目,npm run dev时,以绝对路径引用的相关资源在npm run build 后,页面打开报相关资源404错误: 解决方法如下: 打开build/utils.js,在图中相应位置加入红框内容,其中值可能会有不同,若不同,自己配置成相应的即可. 原文地址:https://www.cnblogs.com/xzma/p/9162584.html

404错误处理:重定向还是直接404?(摘录)

小型网站开发通常会使用某种Web应用框架,比如类似Spring.Express.Django等框架. 这些框架会给出自定义错误页面的方式.当404发生时Web框架会渲染并返回对应的错误页面. 这是最自然和直接的错误处理方式,但有时我们希望错误页面可以单独Serve,比如放到CDN上. 本文档依据RFC 2616(HTTP 1.1)比较几种常见的404错误处理方法: 返回具有404信息的页面,同时给出404状态码. Google.Github.Facebook.Amazon.Linkedin. 重

允许asp.net MVC报 错说明: 访问服务此请求所需的资源时出错。服务器可能未配置为访问所请求的 URL。错误消息 401.2。: 未经授权

运行mvc3程序报以下错误详细报错如下: "/"应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭据和 Web 服务器上启用的身份验证方法查看此目录或页.请与 Web 服务器的管理员联系以获得其他帮助. 版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.3

koa2 get请求后台正常接收参数 前端报404错误

刚学习一门技术时,总会踩一些坑. 前端代码 function del(mId){ $.ajax({ type:"get", url:"/delUser", data:{id:mId}, success:function(data){ console.log('成功了'); console.log(data); } }); } 后台接收请求代码 router.get('/delUser',async (ctx,next)=>{ console.log('接收请求

HTTP错误 404.17 - Not Found&quot; IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理

Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 出现这种情况的原因通常是因为先安装了Framework,后安装的IIS: 运行cmd,输入: C:\Windows\Microsoft.NET\Framework\V4.0.30319\aspnet_regiis -i 注:C:\Windows\Microsoft.Net\Framework\V4.0.30319\   是 netframework安装对应的路径

vue-cli,history 与 tomcat服务器,刷新404,请求资源404,解决办法

前文:CSDN也发布了相同文章,https://blog.csdn.net/qq_41797950/article/details/104373743. 问题:vue-cli,路由history,tomcat服务器,刷新404问题,刷新后请求资源路径不对. 配置:vue-cli:版本2.9.6服务器:tomcat 注:仅是本项目的解决办法,可以参考,希望能帮到大家 1- config文件夹index.js,build下的 assetsPublicPath 改为 ‘/ec/’,名字根据项目自己定义

ajax请求路径正确,可是页面提示404错误。

昨晚项目升级,开发环境.测试环境一切OK,一上线,页面空白.页面console打印404.查看后台日志报如下错误:. Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=' 数据库: mysql 可见404不一定是URL的问题哦. 解决问题的办法: 找到与该请求相关的查询语句,我是用 Spring jdbcTemplate做的,找到对应sql所涉及到