#node.js #angular
#node.js #angular
Вопрос:
Я создал угловое приложение с node.js сервер. Когда я обслуживаю приложение локально (‘ng serve’), приложение работает нормально. Однако, когда я создаю проект Angular в «общедоступную» папку и устанавливаю node.js сервер для обслуживания веб-страниц приложения браузер отображает HTML-код, обслуживаемый сервером, в виде текста.
The node.js код, который обслуживает страницы, следующий:
const express = require('express')
const app = express()
const server = require('http').createServer(app)
const bodyParser = require('body-parser')
const cors = require('cors')
const path = require('path')
const fs = require('fs')
const authRouter = require('./src/middlewares/auth.js');
const roomRouter = require('./src/middlewares/room.js');
const controller = require('./src/middlewares/token.js');
const PORT = process.env.PORT || 8080;
///////////////////////////////////////
//////////// MIDDLEWARES //////////////
///////////////////////////////////////
app.use(bodyParser.json()) //Parsed data is populated on the request object (i.e. req.body).
app.use(bodyParser.urlencoded( { extended: true }))
app.use( (req, res, next ) => {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Requested-With, Accept, x-access-token')
if (req.method == 'OPTIONS') {
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH')
}
res.header('Content-Type', 'application/json') //REST-API: we only send back json data
next()
})
app.use(express.static(path.join(__dirname, 'public')));
//////////////////////////////
///////// DATABASE ///////////
//////////////////////////////
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/sync';
var db;
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
.then(client => {
console.log("connection to database established... ");
db = client.db("sync");
db.createCollection('users'); //Normally, if it already exists, it shoudn't do anything, but I'm not sure
app.use((req, res, next) => {
req.db = db
next();
})
})
.catch(err => {console.log(err)})
///////////////////
//// ROUTING //////
///////////////////
app.use('/api/auth', authRouter)
app.use('/api/room', roomRouter)
app.get('*', (req, res) => {
// res.setHeader('Content-Type', 'text/html')
res.sendFile(path.join(__dirname, 'public', 'index.html'));
// res.send('Hello')
});
///////////////////////////////////////
///////// SOCKET CONNECTION ///////////
///////////////////////////////////////
var sockets = [];
const io = require('socket.io').listen(server);
io.on('connection', (socket) => {
//socket.on...
//...
});
///////////////////////////////////////
///////// SERVER CONNECTION ///////////
///////////////////////////////////////
app.listen(PORT, () => {
console.log("Running on port " PORT)
})
The index.html файл следующий:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Client2</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
<script src="runtime-es2015.js" type="module"></script>
<script src="runtime-es5.js" nomodule defer></script>
<script src="polyfills-es5.js" nomodule defer></script>
<script src="polyfills-es2015.js" type="module"></script>
<script src="styles-es2015.js" type="module"></script>
<script src="styles-es5.js" nomodule defer></script>
<script src="vendor-es2015.js" type="module"></script>
<script src="vendor-es5.js" nomodule defer></script>
<script src="main-es2015.js" type="module"></script>
<script src="main-es5.js" nomodule defer></script>
</body>
</html>
Когда я проверяю веб-страницу, обслуживаемую сервером, только index.html отправляется, а не связанные с ним скрипты, следовательно, не может правильно отобразить страницу. как будто express не обслуживает файлы javascript.
Комментарии:
1. Не могли бы вы поделиться всем файлом *.js?
2. Выполнено. Тем не менее, я все еще работаю с локальной базой данных. Я не знаю, повлияет ли это как-либо на обслуживание веб-страниц.
Ответ №1:
res.sendFile()
это экспресс-функция для отправки файла (https://expressjs.com/de/api.html#res.sendFile). Итак, заголовки будут установлены соответствующим образом. Используйте функцию express res.send()
, чтобы правильно задать ответ и посмотреть наhttp://expressjs.com/en/starter/basic-routing.html.
Еще лучше: используйте простой http-сервер, такой как nginx, или http-сервер npm tool для своих целей.
Комментарии:
1. Я думаю, что проблема не в функции ‘sendFile’. Даже когда я меняю его на ‘res.send (‘Привет’)’, код index.html файл, расположенный в общей папке, по-прежнему отправляется и отображается в виде текста. Я подозреваю, что есть проблема со строкой ‘express.static’.
2. Пожалуйста, взгляните на вторую часть моего ответа. Почему бы не использовать выделенный http-сервер? Зависит ли ваш проект от сервера самостоятельной сборки?
3. На данный момент я использую бесплатную учетную запись Heroku для размещения своего веб-сайта. Heroku не предоставляет статический IP-адрес для сервера, и я не знаю, как настроить nginx без использования ssh. Возможно ли использовать nginx с Heroku?
4. @AchrafElKhamsi к сожалению, я не могу помочь вам с этим, поскольку у меня нет более глубокого опыта работы с heroku. Пожалуйста, обратитесь к документам в качестве первого шага.