Node JS 部署

4

我试图把我的Node JS应用程序放到我的学生项目中。

这是项目:

项目

N.B:Public是使用Vue JS创建的前端经过“npm run build”后的结果

当我在本地工作时,我使用特定的路径来调用后端请求。例如:“http://localhost:3000/read/chosenemployee/

代码示例

但是当我将我的项目放到网上时,我使用命令“npm start”并使用不同的端口(例如3535),并将“http://localhost:3000”替换为“https://localhost:3535”,然后出现错误“ERR_CONNECTION_REFUSED”。我还尝试了以下方法:

但是没有任何改变。

这是我的app.js:

//1- CREATION DES DEPENDANCES DE MODULES
//MODULE DE JS.NODE
// const https = require('https');
// const fs = require('fs');
// var http = require("http");
const express = require('express');
const app = express();
//Paramétrage du CORS afin qu'il n'y ai pas de blocage
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

const router = express.Router();
const cors = require("cors");
const mysql = require('mysql');
const bodyParser = require('body-parser');
const mysqlApostrophe = require("mysql-apostrophe");
//Module permettant de faire des refresh en SPA
const history = require('connect-history-api-fallback');

//IMPORT DES MODULES CREES
var dataBase = require('./routes/dataBase');

//ATTENTION SEMBLE POSER PROBLEME A NODE EN LOCAL
app.use(history()); 
app.use(cors());
//2- MISE EN PLACE DU BODY PARSER QUI PERMET DE LIRE LES JSON ET URL ENVOYE PAR LE FORMULAIRE
app.use(bodyParser.json()); // LIRE LES BODY ENCODES EN JSON
app.use(bodyParser.urlencoded({ // LIRE LES BODY ENCODES EN URL
    extended: true
}));

//Mise en place de express
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
    extended: false
}))

//3- MISE EN PLACE DE mysqlApostrophe
app.use(mysqlApostrophe); //PERMET D'INSERER DES CHAMPS CONTENANT DES APOSTROPHES


//4- RECUPERATION DES FICHIERS ROUTES DANS LE DOSSIER ROUTES
const creation = require("./routes/create");
const lecture = require("./routes/read");
const maj = require("./routes/update");
const suppression = require("./routes/delete")

//5- UTILISATION DES ROUTES
app.use("/create", creation);
app.use("/read", lecture);
app.use("/update", maj);
app.use("/delete", suppression)

//Gestion de la mise en production
if (process.env.NODE_ENV === 'production') {
    //Static folder
    app.use(express.static(__dirname + '/public/')).use
    //Handle SPA
    app.get(/.*/, (req, res) => res.sendFile(__dirname + '/public/index.html'));
} else {
    //Static folder
    app.use(express.static(__dirname + '/public/')).use
    //Handle SPA
    app.get('/', (req, res) => res.sendFile(__dirname + '/public/index.html'));
}

//4- CHOIX DU PORT UTILISE PAR LE SERVEUR
const port = process.env.PORT || 8898; //RECUPERE UN PORT LIBRE SINON 3000
app.listen(port, function () {
    console.log("Le serveur utilise le port : " + port)
});

这是我放在public_html文件夹根目录下的.htaccess:

#1. Forcing HTTPS connection:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#2. Removing port from URL:
Options +FollowSymLinks -Indexes
IndexIgnore *
DirectoryIndex

# Add headers to all responses.
<IfModule mod_headers.c>
RequestHeader set X-Forwarded-Proto https
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine on
# Simple URL redirect:
RewriteRule ^(.*)$ http://127.0.0.1:8898/$1 [P]
</IfModule>

在线文件夹:

在线文件夹


一个关于“当我把我的项目放到网上时”的问题:在哪里以及如何? - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans,感谢您的回答。我将我的网站放在fastcomet.com上,使用c-panel,即使只使用public_html文件夹,它也无法正常工作。 - Yassuke
你尝试过按照 cPanel 文档提供的步骤操作吗? https://documentation.cpanel.net/display/CKB/How+to+Install+a+Node.js+Application - Quisse
1
也许我错了,但是这个规则 RewriteRule ^(.*)$ http://127.0.0.1:8898/$1 [P] 不是会将所有请求都重写到 localhost:8898 吗?启用它后就没有办法远程连接了。 - Klaycon
1
确实如此。@Yassuke 记得查看你的开发工具,特别是“控制台”和“网络”选项卡,因为那里你会看到错误和实际发生的网络请求。 - Mike 'Pomax' Kamermans
4个回答

2

您可能需要检查您托管应用程序的端口。通常非标准端口会被关闭,尝试使用标准端口如80、443进行服务。这样外部请求就会被阻止。如果您可以在本地测试您的请求,那么就可以排除外部世界无法访问您的应用程序的情况(ssh或远程连接到托管服务器,并运行类似curl localhost:3535的命令)。


谢谢你的回答,但不幸的是它没有起作用。我不明白为什么。也许我忘记了什么,但我不知道是什么。 - Yassuke
我同意noobius的看法,这似乎是一个端口问题。远程服务器上console.log输出了什么?远程服务器上的process.env.PORT是多少? - Sylvain

1

const port = process.env.PORT || 8898; //Retrieve a free port if not 3000

这很可能是问题所在,删除 'process.env.PORT ||' 并再次尝试使用端口 8898。


1
地址中的主机名为http://localhost:3535的主机是localhost,这总是指本地计算机。
当您在另一台计算机上启动项目并想从自己的计算机访问它时,您将不得不输入该计算机的地址。如果您知道其IP地址,则可以将localhost替换为它,例如http://151.101.129.69:3535。(此示例IP地址是stackoverflow的IP)
如果机器有一个可读的主机名关联,您可以使用该名称,例如http://www.example.org:3535
这些示例假定您的应用程序正确启动并且未被防火墙阻止。

谢谢您的回答。我尝试按照您的建议,但是它没有起作用。 - Yassuke
3
一个裸露的“它不起作用”的陈述会关闭这整个解决方案,这样做不好,因为这是正确的答案,那具体哪一部分不起作用呢? - Klaycon

1
在你的代码的这部分


app.listen(port, function () {
console.log("Le serveur utilise le port : " + port)
});

尝试像这样修改:

尝试进行以下修改:

app.listen(port,HOST, function () { // port, your hostString, and callback
console.log("Le serveur utilise le port : " + port)
});

有时候这就是问题所在。
如果你想在你的服务器上使用https,你需要按照以下步骤进行:
//your other code stuff
const https = require('https'); 
const options = {}// your credentials options
const server = https.createServer(options,app);


server.listen(port,HOST, function () { // port, your hostString, and callback
console.log("Le serveur utilise le port : " + port)
 });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接