【发布时间】:2021-05-06 06:14:11
【问题描述】:
我正在使用 nodejs、js 和 html 制作选举软件。我现在使用端口 3000 将静态文件托管在公共文件中,并在端口 4000 中侦听前端的请求以编辑数据库。我需要一种方法来同时使用单个端口。
解释更多:我有一个包含 html 和 js 代码的公共文件以及一个存储所有数据的 poll.json 文件。所以使用端口 3000 托管这个公共文件。在前端,我使用端口请求到端口 4000,发送投票详细信息以在数据库中进行编辑。我是 HOSTING 服务器的新手,对各种方法感到困惑。
这是我现在的代码:
const createServer = require('http').createServer;
var express = require('express');
var app = express();
let pollData = require(__dirname+'/public/poll.json');
var fs = require('fs');
var all_usn_no=[];
const listening_port=4000;
//const hosting_port=process.env.PORT || 3000;
const hosting_port=3000;
function get_roll_and_usn(pollData){
for(var i=0;i<=pollData.students.length-1;i++){
//all_roll_no.push(pollData.students[i][0]);
all_usn_no.push(pollData.students[i][1]);
}
}
function roll_to_row(in_usn){
get_roll_and_usn(pollData)
return all_usn_no.indexOf(in_usn);
}
function write_vote(votes){
var checking_row=roll_to_row(votes[1]);
pollData.students[checking_row]=votes;
fs.writeFile(__dirname+'/public/poll.json', JSON.stringify(pollData), (err) => {
if (err) throw err;
console.log('Data written to file');
});
}
const server_listen = createServer((req, res) => {
let body = '';
req.on('data', data => body += data)
req.on('end', () => {
res.writeHead(200, {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET',
});
body=body.split(",");
console.log(body.toString());
write_vote(body);
res.end(`{ "response": "${body ? body : 'No body sent' }" }`);
})
});
server_listen.listen(listening_port, () => {
console.log('Server listening on '+listening_port);
} );
var server_host = app.listen(hosting_port, 'localhost',function(){
console.log('listening for requests on port '+hosting_port);
});
//Static files
app.use(express.static('public'));
编辑:目前我已经像这样编辑了我的代码。
const createServer = require('http').createServer;
var express = require('express');
var finalhandler = require('finalhandler');
var serveStatic = require('serve-static');
var serve = serveStatic('/public');
let pollData = require(__dirname+'/public/poll.json');
var fs = require('fs');
var all_usn_no=[];
const listening_port=3000;
function get_roll_and_usn(pollData){
for(var i=0;i<=pollData.students.length-1;i++){
//all_roll_no.push(pollData.students[i][0]);
all_usn_no.push(pollData.students[i][1]);
}
}
function roll_to_row(in_usn){
get_roll_and_usn(pollData)
return all_usn_no.indexOf(in_usn);
}
function write_vote(votes){
var checking_row=roll_to_row(votes[1]);
pollData.students[checking_row]=votes;
fs.writeFile(__dirname+'/public/poll.json', JSON.stringify(pollData), (err) => {
if (err) throw err;
console.log('Data written to file');
});
}
const server_listen = createServer((req, res) => {
if (req.method === "GET") {
fs.createReadStream("./public/index.html", "UTF-8").pipe(res);
}
else if (req.method === "POST") {
console.log('post request');
let body = '';
req.on('data', data => body += data)
req.on('end', () => {
res.writeHead(200, {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET',
});
body=body.split(",");
console.log(body.toString());
write_vote(body);
res.end(`{ "response": "${body ? body : 'No body sent' }" }`);
})
}
});
server_listen.listen(listening_port, () => {
console.log('Server listening on '+listening_port);
});
但我仍然只能托管 index.html。但我想托管整个公共文件。我从互联网上尝试了一些只会带来错误的解决方案。我现在如何托管公共文件?
【问题讨论】:
-
为什么不简单地使用具有不同 url 的相同端口来处理静态文件和请求,或者更一般地使用不同类型的请求(get 或 post)?请进一步解释问题
-
我不明白/不明白如何使用不同的网址。这段代码本身我只是从有效的互联网上处理的。现在修改它似乎令人困惑。如果你能展示我应该改变什么会很有帮助。
-
有很多方法可以做到这一点。所有这些都需要先更多地了解 express 方法。一种非常简单的方法是为服务器提供
GET请求的静态文件,并在前端发送POST请求时记录投票。 Express documentation 中介绍了您将使用的app.get和app.post方法
标签: javascript node.js webserver port