Я знаю, что лучше использовать ExpressJS, но я хочу понять основные API NodeJS. Я хочу создать самый простой сервер без каких-либо модулей. Везде мы можем найти код для сервера, который отправляет только html-файл:
const fs = require('fs')
const http = require('http')
const path =require('path')
const server = http.createServer((req,res)=>{
fs.readFile(path.join(__dirname,'index.html'),(err,data)=>{
if (err){
throw err
}
res.writeHead(200,{'Content-Type':'text/html'})
res.end(data)
})
}).listen(8080, () => {
console.log('Server running on port 8080')
})
server.on('request', (req, resp) => {
if(req.url === '/' && req.method === 'GET') {
data=fs.readFileSync(__dirname + '/index.html')
resp.writeHead(200, {
'Content-Type': 'text/html',
})
return resp.end(data)
}
})
Если я попытаюсь отправить index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Test</title>
</head>
<body>
<h1 id="text">Hello!</h1>
<button id="change">Change</button>
<script src="index.js"></script>
</body>
</html>
файл сценария index.js не загружается. Пример index.js:
const text=document.getElementById('text')
const change = document.getElementById('change')
const col1='rgb(255, 0, 0)'
const col2='rgb(0, 0, 0)'
change.addEventListener('click', () => {
if (text.style.color===col1){
text.style.color=col2
}else{
text.style.color=col1
}
})
Как я могу отправить два файла: index.html и index.js через чистый Node.js? Аналогичный вопрос для ExpressJS: Node.js обслуживает HTML, но не может загружать файлы сценариев на обслуживаемой странице, но там используется Express, в этом вопросе я хочу использовать чистый node.js.
Если я копирую код из index.js в раздел <script>, javascript работает, если я включаю index.js через <script scr>, то javascript не работает. Как это объясняется в Node.js обслуживает HTML, но не может загружать файлы сценариев на обслуживаемой странице. Мне нужно передать этот файл index.js с сервера на клиент. Как я могу это сделать?
Я думаю, вам нужен еще один оператор if в вашем server.on('request', ...)
. Текущий оператор if имеет дело только с index.html
Вы можете попробовать это, я еще не тестировал код, но по логике он должен работать:
server.on('request', (req, resp) => {
if(req.url === '/' && req.method === 'GET') {
data=fs.readFileSync(__dirname + '/index.html')
resp.writeHead(200, {
'Content-Type': 'text/html',
})
return resp.end(data)
}
// add this code
if(req.url === '/index.js' && req.method === 'GET'){
data=fs.readFileSync(__dirname + '/index.js')
resp.writeHead(200, {
'Content-Type': 'application/javascript',
})
return resp.end(data)
}
})
script scr=
... несет ли какую-либо ответственность за проблему, с которой вы столкнулись? файл в любом случае должен быть доступен как актив в wwwroot. Вы не должны служить активам через действия