发布
社区首页 >问答首页 >Node.js服务器响应javascript文件,而不是主.html?

Node.js服务器响应javascript文件,而不是主.html?
EN

Stack Overflow用户
提问于 2018-08-21 07:49:10
回答 1查看 151关注 0票数 0

我有一个简单的node.js服务器,它用我的index.html文档响应地址为http://localhost:3000/hi/的GET请求,但我不明白它为什么读取/响应一个(索引)和index.js。

我使用路由器对象的函数是:

代码语言:javascript
代码运行次数:0
复制
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);

代码语言:javascript
代码运行次数:0
复制
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 (此文件的名称)位于我桌面上的同一文件夹中。希望这能有所帮助。

EN

回答 1

Stack Overflow用户

发布于 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框架,而不使用已经构建的框架,那么您可能会想要编写这样一个静态匹配器。但是,重要的是,将静态文件匹配器指向只包含公共文件的目录,这样人们就不会无意中访问私有服务器文件。此外,还必须防止..或根路径等内容出现在网址中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51939855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档