无法在 nodemon 的 HTML 中找到嵌入式脚本

Cant find embedded script in HTML in nodemon

我是新手,正在尝试 JS。我试图构建一个小型 Node.js 应用程序,在 index.html 中嵌入了一个 JS 脚本,但是当我 运行 nodemon 时,它 returns 404 用于脚本并且找不到它。带有嵌入式脚本的相同 html 页面可以很好地处理 parcel。我做错了什么?

我的 app.js :

const express = require('express')
app = express()

app.get('/', (req, res, next)=>{
    
    res.sendFile('D:/Node.js Folder/My first project/views/index.html')
    
})

app.get('/add-user', (req, res, next)=>{
    
    res.sendFile('D:/Node.js Folder/My first project/views/add-user.html')
    
})

app.get('/show-user', (req, res, next)=>{
    
    res.sendFile('D:/Node.js Folder/My first project/views/show-users.html')
    
})

app.listen(3000)

HTML 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    
</head>
<body class = "text-gray-400">
    
    <div>
        <div class = "text-3xl">
            <nav>
                <h1>
                    Hello! Welcome to the first page!
                </h1>
                <h1 class = "chat-notification-title">
                    Hello! Welcome to the first page!
                </h1>
                <form>
                    <label for="cname">Company Name</label><br>
                    <input type="text" id="cname" name="cname"><br>
                    <label for="ccode">Company Code</label><br>
                    <input type="text" id="ccode" name="ccode">
                  </form> 
                  <button class ='btn-submit' type = "submit">Add Record</button>
            </nav>
        </div>
    </div><script src="../controller/controller-1.js"></script>
</body>
</html>

嵌入式脚本:

'use strict'


console.log(document)
const button = document.querySelector('.btn-submit')
console.log(button)
button.addEventListener('click', function () {
    
    console.log('BUTTON PRESSED')
    alert("Pressed")
})

Nodemon 应该在服务器端使用,通常 运行 用于 express 或类似服务器。 parcel serve 是你应该在客户端(没有服务器)使用的,直接为 html 文件提供服务。

您也不应该使用自己磁盘的路径。幸运的是,当项目 运行ning 时,它会创建一个包含相同文件的 dist 文件夹。你应该 link 那些到代码中的路径。即在 res.sendFile 你应该写 res.sendFile(path.resolve("../client/dist/index.html"))res.sendFile(path.resolve("../dist/views/index.html))

您将路径导入为 import * as path from "path"

如果你想在服务器上使用它,那么你应该这样做:

客户端 json“dev”应该 parcel watch index.html,服务器“dev”应该 nodemon server.js。 这两个脚本都应该在 运行 根 package.json 文件中,同时允许它们 运行 同时

"dev": "concurrently npm:server:dev npm:client:dev",
"server:dev": "cd server && npm run dev",
"client:dev": "cd client && npm run dev",

在服务器文件中,您应该执行如下操作:

import express from "express"; //import express
const app = express(); // use express
app.use(express.static("../client/dist/")); // allows express to server static files

app.use((req, res, next) => {
  if (req.method === "GET" && !req.path.startsWith("/api")) {
    return res.sendFile(path.resolve("../client/dist/index.html"));
  } else {
    next();
  }
}); // checks if url is trying to reach an api, if not it returns the file you are looking for

const server = app.listen(process.env.PORT || 3000, () => {
  console.log("Server started on http://localhost:" + server.address().port);
}); // starts server and logs the localhost url

然后你打算从服务器端访问你的站点,每次你更改服务器时,nodemon 都会为你重新启动服务器,每次你更改客户端时,parcel 都会做同样的事情

您需要做的一件事是停止使用绝对路径

例如。 'D:/Node.js Folder/My first project/views/index.html'

应该是./views/index.html

假设 app.js 文件与视图文件夹位于同一文件夹中。

您可能部署此代码的服务器不会与您的电脑具有相同的路径。

您可能还想创建一个静态文件夹并将您的 html、脚本(控制器)文件夹移动到其中 并将以下行添加到 app.js

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

// or

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

这样您就不必像现在这样处理单个文件。

如果您将嵌入文件的 src 设置为 ./controller/controller-1.js,它将正常工作。

我通过将此添加到我的 app.js 来解决它:

app.get('/controller/controller-1.js', (req, res, next)=>{

res.sendFile('D:/Node.js Folder/My first project/controller/controller-1.js')

})

来自此线程的帮助:How to include javascript on client side of node.js?

有更好的方法吗?