【问题标题】:Nodejs web hostingNodejs 网络托管
【发布时间】: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.getapp.post 方法

标签: javascript node.js webserver port


【解决方案1】:

您不需要导入 http 模块,因为 express 就足够了。您需要的是只使用一个端口号进行快递。您正在创建两个不同的服务器。 Express 足以创建一个服务器。

NOTE1- 通过设置app.use(express.static(__dirname+'/public')),您告诉 express 将 public 中的所有文件添加到 url。例如。 image.png in public 文件夹可以通过localhost:3000/image.png url访问

NOTE2- 下面的代码可能无法满足您的需求,因为不清楚 body 变量中的内容。

您必须阅读here 的至少 5 章。页面下方有next按钮可以进入下一章节。

在其他任何事情之前进一步阅读this会更清楚地阐明事情。阅读5章

你的代码应该是这样的-

const express = require('express')
const app = express()
const port = 3000
let pollData = require(__dirname+'/public/poll.json');
var fs = require('fs');
var all_usn_no=[];

//Static files
app.use(express.static(__dirname+'/public'));

//below will be your homepage(I.e. "localhost:3000/ ")
  app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});

  app.post('/', (req, res) => {
    let body=JSON.parse(req.body);
        console.log(body.toString());
        write_vote(body);

});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})
});

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');
  });
}

【讨论】:

  • 感谢这确实有效。我只需要替换我在发布请求中的代码,然后它就可以根据需要工作。非常感谢。
  • @Pranav Kumar 即使那样,您也应该阅读给定链接中的文档。它会让你变得更好
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 2018-08-06
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2010-09-08
  • 2015-01-17
相关资源
最近更新 更多