Javascript文件未在本地主机上加载

如何解决Javascript文件未在本地主机上加载

我只是在学习快递,我试图在localhost:3000上创建一个简单的网页。我创建了一个带有提交按钮的文本框,单击该按钮将把文本元素放入文本框并在控制台上打印。

我的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文件中的script标签内,则JavaScript可以正常工作

解决方法

一旦您的html返回到导航器,它将加载所需的所有资源(例如图像,css或脚本)。这就是为什么您遇到404错误,无法到达“ localhost / test.js”的原因

所以您必须使test.js可用。

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

因此,在具有node.js文件的位置,创建一个“公共”文件夹

将test.js文件放入其中。

在您的app.listen()之前的Node中添加它:

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

在HTML中:

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

“静态”是您要用于公共路线的名称 “ public”是您应用中文件夹的名称

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

您可以添加子文件夹。例如,将test.js放在路径app / public / js / test.js中。 并使用src =“ / static / js / test.js”在HTML中引用它

,

让我们进一步说明在创建诸如节点服务器之类的节点服务器时会发生什么。

启动时(使用app.listen()),服务器将侦听传入的请求并返回篷。

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

如果现在尝试访问服务器的“ localhost:3000 /”,请执行回调((req,res) => res.render('test')),并在此回调中使用Handlebar生成html页面,该页面将发送到导航器。

然后,导航器获取HTML,对其进行解析并找到几个链接(例如<script src="./test.js">以及<img href="./myimage.png"><stylesheet href="./style.css">) 为了能够完全呈现页面,导航器将请求找到的每个链接以获取关联的资源。

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

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

正如我所说,您可以创建一个“公共”文件夹,并告诉您的应用程序它包含静态文件: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”。

我希望这一点更加清楚,对不起英语不好,这不是我的母语。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-