Javascript 文件未加载到本地主机

Javascript file isn't loading on local host

I am just learning express and I tried to create a simple webpage on localhost:3000. I created a text box with a submit button, which on click will get the text element inside the text box and print it on the console.

我的node.js代码是:

const express = require('express')
const path = require('path')
const hbs = require('hbs')

const app=express();

app.set('view engine', 'hbs');
const dir= path.join(__dirname,'../templates/views');
const partials=path.join(__dirname,'../templates/partials')
app.set('views',dir);
hbs.registerPartials(partials);

app.get('', (req, res) => {
    res.render('test')
});

app.listen(3000, () => {
    console.log(`Server started on port`);
});
 

test.hbs文件编码为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
     {{>header}}
    <form class="form">
        <input type="text" placeholder="Write here" class="textbox">
        <input type="submit" class="btn">
    </form>
    <script src="./test.js"></script>
</body>
</html>

而javascript代码是

const values={
    nodeForm:document.querySelector('.form'),
    nodeText:document.querySelector('.textbox'),
    nodeBtn:document.querySelector('.btn')
}

values.nodeForm.addEventListener('submit',e=>{
    e.preventDefault();
    console.log(nodeText.value)
    
})

但是当我打开 localhost:3000 时,控制台页面给我一个错误,显示 GET http://localhost:3000/test.js net::ERR_ABORTED 404 (Not Found)

编辑:如果我将脚本放入 test.hbs 文件

中存在的脚本标签内,Javascript 工作正常

一旦您的 html 返回到您的导航器,它将加载它需要的任何资源(例如图像、css 或脚本)。这就是为什么出现 404 错误,它无法到达 'localhost/test.js'

所以你必须test.js可用。

常用的方法是使用 /public 文件夹并将所有静态资源放入其中。

因此,在您拥有 node.js 文件的位置,创建一个“public”文件夹

将您的 test.js 文件放入其中。

在 app.listen() 之前在 Node 中添加这个:

app.use('/static', express.static('public'));

在HTML中:

<script src="/static/test.js"></script>

'static' 是您想要的 public 路由名称 'public' 是您应用程序中文件夹的名称

当然,您可以根据需要更改路径和文件夹名称。

并且您可以向其中添加子文件夹。例如将 test.js 放在路径 app/public/js/test.js 中。 并在 HTML 中使用 src="/static/js/test.js"

引用它

让我们进一步解释当您创建像您这样的节点服务器时发生了什么。

当您启动它时(使用 app.listen()),服务器将侦听传入请求和 return awnser。

如果您尝试访问 'localhost:3000/dumb',导航器会请求您的服务器向他询问“/dumb”路线。由于它不存在,服务器会报 404 错误。

如果您现在尝试访问 'localhost:3000/' 服务器找到一个路由,执行您的回调 ((req, res) => res.render('test')) 并且在这个回调中您使用 Handlebar 生成一个 html 页面,它是发送到导航器。

然后导航器得到 HTML,解析它并找到几个 link(像 <script src="./test.js"> 但也有 <img href="./myimage.png"><stylesheet href="./style.css">) 为了能够完全呈现页面,导航器将请求它找到的每个 link 以获取关联的资源。

因此,在您的情况下,导航器向 'localhost:3000/test.js' 发送了一个请求,并且在我的第一个愚蠢示例中,服务器 awnser 不知道这条路线。

您可以为每个资源创建一个路由(app.get('./test.js', /*...*/) 并通过回调发回正确的资源。 但由于这些文件只是静态的(不需要任何计算),解决它的最常见方法是使它们静态可用。 这意味着对您的应用程序说“此文件夹中充满了静态文件,请为它们服务”。

正如我所说,您可以创建一个 'public' 文件夹并告诉您的应用它包含静态文件:app.use(express.static('./public')); 当然 './public' 是根应用程序的正确路径(其中 package.json 和 node_modules 是)。

但是,此文件夹中的每个文件和文件夹都成为可达路由。所以如果你有一个 'js' 文件夹,然后你想创建一个 app.get('/js', /*...*/) 路由,你就会有冲突。

所以通常的做法是把这个文件夹放在一个路由下。例如 app.use('/static', express.static('./public')); 将使 './public' 文件夹下的所有内容在 '/static' 路由下可用。在你的情况下 'localhost:3000/static/test.js'.

我希望这更清楚,抱歉英语不好,这不是我的母语。