使用 nodejs 时,遇到了一个问题,求助大家

258 天前
 ARslince
node 版本:16.13.2

问题描述:

我在 server.js 中使用 fs.readFileSync 去读取一个 html 文件,然后用 response.end(html) 返回结果。

问题来了,如果 html 文件中 js 和 css 分别采用 <script> 标签和 <style> 标签引用,那么返回到页面的效果

正常;如果 js 和 css 都采用外部引入方式,那么样式和逻辑都不会被返回,这是为什么呢?

以下是 server.js 和 index.html

const http = require('http')
const fs = require('fs')


const server = http.createServer((req, res) => {
let { pathname } = new URL(req.url, 'http://127.0.0.1')
if (pathname === '/index.html') {
let html = fs.readFileSync('./page/index.html')
res.end(html)
}
})

server.listen(9000, () => {
console.log('server is runing......');
})




<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- <link rel="stylesheet" href="./css/index.css"> -->
<style>
td {
padding: 20px 40px;
}

table tr:nth-child(odd) {
background-color: #aef;
}

table tr:nth-child(even) {
background-color: #fcb;
}

table,
td {
border-collapse: collapse;
}
</style>
</head>

<body>
<h1>你好呀 111</h1>
<table border="1">
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</body>
<!-- <script src="./js/index.js"></script> -->
<script>
const tds = document.querySelectorAll('td')
tds.forEach(item => {
item.onclick = function () {
this.style.background = '#222'
}
})
</script>

</html>


这是正常的显示样式


而当我把 css 和 js 使用外部引入的方式就出问题了


点击×号取消后,是如下样子
1440 次点击
所在节点    问与答
14 条回复
HelloWorld556
258 天前
是要设置 public 吗?我很少用 nodejs , 不知道对不对
powerN
258 天前
你这两个文件是请求的 ./ 目录下的。对应 127.0.0.2:9000/css 127.0.0.2:9000/js
但是没看到你在 nodejs 中返回这两个文件。且一直 pending 的可能是不是因为你只判断了 pathname === '/index.html' 才 res.end()
其他的资源没有就不会 res.end.
gadfly3173
258 天前
看起来像是浏览器不能访问到你的 css 和 js 文件,你看看你是不是没处理对其他文件的访问请求
zhangxh1023
258 天前
比如:你引入了 `./js/index.js` ,那么浏览器会像你的当前网址的相对路径,请求资源 `index.js`,你可以在 network 里面看到请求的目标地址,应该是: `http://xxxx:9000/js/index.js`, 如果你的服务端没有返回对应的 js 文件,就不行了。

你应该搜索一下: web 静态资源服务器
lanz0519
258 天前
你只是返回了 html 的资源,类似的功能通过 static 方式去管理更好,搜 nodejs 静态资源管理就能搜到
Rache1
258 天前
你这 server 回调里面只对 index.html 做了处理响应呀。
crazyTanuki
258 天前
我觉得是路径问题
ARslince
258 天前
谢谢各位老哥,问题已经解决了,原因是因为我 server 回调中只对 index.html 做了处理,并没有对 css 和 js 做处理,感谢各位!
mdn
258 天前
你这也太简陋了吧,是学习吗?

用下 express 也不至于有这个问题
https://expressjs.com/en/starter/static-files.html
ARslince
258 天前
刚开始学 nodejs ,在看一些比较基础的内容
victimsss
258 天前
nodejs 学一下主要的模块 然后可以按照项目的思路写 demo 了,网上很多 express 和 Nestjs 的教程。
knva
258 天前
因为静态文件没找到呗
iOCZ
258 天前
得把本地 require 地址变为服务器地址
webszy
258 天前
你尝试自己写 web 服务器,就要自己处理各种静态资源,除非你把那些资源内联到 html 里

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/967827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX