我有一个简单的node.js服务器,它用我的index.html文档响应地址为http://localhost:3000/hi/的GET请求,但我不明白它为什么读取/响应一个(索引)和index.js。
我使用路由器对象的函数是:
const http = require('http');
const path = require('path');
const fs = require('fs');
let contacts = {
"1234": {
id: "1234",
phone: "77012345678",
name: "Sauron",
address: "1234 Abc"
},
"4567": {
id: "4567",
phone: "77012345678",
name: "Saruman",
address: "Orthanc, Isengard"
},
};
let loadStatic = (req, res) => {
res.writeHead(200, {'Content-Type': 'text/html'});
fs.readFile('./index.html', null, (err,data) => {
if (err) {
return console.log('error');
} else {
res.write(data);
}
res.end();
});
}
let routes = [
{
method: 'GET',
url: /^\/contacts\/[0-9]+$/,
run: getContact
},
{
method: 'DELETE',
url: /^\/contacts\/[0-9]+$/,
run: deleteContact
},
{
method: 'GET',
url: /^\/contacts\/?$/,
run: getContacts
},
{
method: 'POST',
url: /^\/contacts\/?$/,
run: createContact
},
{
method: 'GET',
url: /\/hi\//,
run: loadStatic
},
{
method: 'GET',
url: /^.*$/,
run: notFound
}
];
let server = http.createServer((req, res) => {
let route = routes.find(route =>
route.url.test(req.url) &&
req.method === route.method
);
route.run(req, res);
});
server.listen(3000);
Request URL: http://localhost:3000/hi/index.js
Request Method: GET
Status Code: 200 OK
Remote Address: [::1]:3000
Referrer Policy: no-referrer-when-downgrade
Connection: keep-alive
Content-Type: text/html
Date: Mon, 20 Aug 2018 23:41:45 GMT
Transfer-Encoding: chunked
上面是google chrome浏览器处理的响应。首先,我不知道(索引)是什么-它包含了我所有的html脚本,以及index.js (可能还与html文档一起发送),这是应该控制DOM的javascript文件的名称。两者都包含html脚本,这是不正确的,.js应该是不同的,并且它尝试首先读取.js。此外,控制台中的错误显示“意外的'<'”,这应该很明显,因为它试图读取一个只包含.html脚本的.js文件。我还是个新手,找不到答案。感谢您的阅读,希望您能修改一下!
**EDIT -我在服务器脚本中添加了更多相关代码。有很多编辑过的函数,但它们都工作得很好。index.html、index.js (此文件控制index.html中的DOM和gets脚本标记)和newserver.js (此文件的名称)位于我桌面上的同一文件夹中。希望这能有所帮助。
发布于 2018-08-21 10:37:53
index.js
并不是像你想象的那样和index.html
一起“被送来的”。浏览器首先请求/hi
。
因为您没有/index.js
的路由,所以它将匹配您的notfound
路由(您没有显示它的代码)。仅供参考,您的notfound路由可能会返回404状态,因为这会使调试变得更容易(在浏览器控制台中会有404错误,很容易看到)。
您需要为您的HTML文件引用的所有资源(脚本、css文件、图像等)提供路由。默认情况下,node.js不提供任何文件(与某些其他web服务器不同)。它只服务于您专门为其编写路由和编写要发送的代码的文件。
可以编写一个通用路由,它将为特定目录中与请求完全匹配的任何文件提供服务。Express框架具有这样的特性,并被称为express.static()
。对于只需要发送静态文件的静态资源来说,它非常有用。如果您打算继续编写自己的http框架,而不使用已经构建的框架,那么您可能会想要编写这样一个静态匹配器。但是,重要的是,将静态文件匹配器指向只包含公共文件的目录,这样人们就不会无意中访问私有服务器文件。此外,还必须防止..
或根路径等内容出现在网址中。
https://stackoverflow.com/questions/51939855
复制相似问题