繁体   English   中英

当有人访问页面时开始监听端口吗? Node.js Express

[英]Start listening to a port when someone visits a page? Node.js, Express

我被困在node.js,express和一个难以理解的地方之间,试图弄清楚当有人查看网页时如何在端口上侦听。 只要我可以在终端中键入node index.js来监听端口3000,我的代码就可以正常工作。

在寻找答案的3天里,我没有方向。 我的头旋转的速度不足为奇。

简而言之,当有人查看网页时,如何开始在端口上侦听?

我正在尝试做的事[尽可能安全]:

  • 从submit.html的提交表单中获取信息
  • 通过express和Body-Parser推送表单字段
  • 将其存储在远程服务器上的MySQL表中。

我的代码可以根据需要进行工作(减去一些访问问题)。 它在提交表单时提取信息,对其进行解析,在池中建立一个MySQL连接(我认为),并将数据存储在另一台服务器的DB中。 如前所述,这仅在我首先在终端中键入node index.js时有效。

对我来说,除非您在终端中输入node index.js,否则我什么都听不见! 当访问者访问您的页面时(我的情况是提交表单),人们如何开始在端口上侦听?

我有一些想法,需要一些指导。 我觉得我缺少链接的一个链接,这阻碍了我的整个项目。

我认为我需要以下之一:

  • tcplistener
  • 使用套接字..如Socket.io
  • http(s).createServer
  • nginx端口配置监听

我在正确的轨道上吗? 我需要这些吗? 我已经尝试了这些以及很多其他方法,但是每次尝试实现某人的代码时代码中断时,我都不知道需要什么。

以下是出于笑目的我的代码。

这是由index.js获取的表单:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">

<title>Title</title>

<style type="text/css">

</style>

<meta name="robots" content="dofollow" />
<meta name="googlebot" content="dofollow" />

<meta name="description" content=" " />

<meta name="google" content="nositelinkssearchbox" />

</meta>
</body>

<body>

<form id="data-form"  action="http://x.x.x.x:3000/form" method="POST">

<input type="text" name="uid" value="13">

URL:<br>
<input type="text" name="urll" value="Add"><br>

Title:<br>
<input type="text" name="title" value="Title"><br>

Description:<br>
<input type="text" name="blurb" value="Summary"><br>

Tags:<br>
<input type="text" name="tags" value="Three"><br>

<br>
Choose a thumbnail<br>
<br>

<br>
<input type="submit" value="Submit" />

</form>
</body>
</html>

这是我的index.js文件:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

var jsonParser = bodyParser.json();
var urlencodedParser = bodyParser.urlencoded({ extended: true });
var mysql = require('mysql');

// Configure MySQL connection
var pool = mysql.createPool({
        connectionLimit: 50,
        host: 'x.x.x.x',
        user: 'xx',
        password: 'xxxx',
        database: 'rawdata'
  });

//Establish MySQL connection
pool.getConnection(function(err, connection) {
   if (err)
      throw err;
   else {
       console.log('Connected to MySQL');
       // Start the app when connection is ready
       app.listen(3000);
       console.log('Server listening on port 3000');
 }
});

app.use(bodyParser.urlencoded({ extended: true }));

app.use(bodyParser.json({ type: 'application/*+json' }));

//allow express to access our file
app.get('/form/form.html', function(req, res) {
        res.sendFile(__dirname + "/form/" + "form.html");
    });

//This sends the user information to the path
app.post('/form', urlencodedParser, function(req, res, connection){

    var jsondata = req.body;
    var values = [];

      values.push([jsondata.uid,jsondata.title,jsondata.tags]);

    //Bulk insert using nested array [ [a,b],[c,d] ] will be flattened to (a,b),(c,d)
    pool.query('INSERT INTO raw (uid, title, tags) VALUES ?', [values], function(err,result) {

      if(err) {
         console.log('Error' + err + req.body);
      }
     else {
         res.status(200).send('Done');
      }

    });
    });

您可以使用serve-sent-events(sse) ,这是一种简单的流技术。使用sse-nodejs库可以实现此目的。您可以在访问页面时添加添加侦听器。 server.js

var SSE = require('sse-nodejs');

var express = require('express');

var app = express();

app.get('/', function (req,res) {
   res.sendFile(__dirname+ '/index.html');
});

app.get('/time', function (req,res) {
    var app = SSE(res);

    app.sendEvent('time', function () {
        return new Date
    },1000);

    app.disconnect(function () {
        console.log("disconnected");
    });

    app.removeEvent('time',3100);

});

app.listen(3000, function () {
    console.log('Simple SSE server start at port: 3000')
});

index.html

<!DOCTYPE html>
<html>
<head></head>
<body>
HELLO WORLD
<div id="clock"></div>
</body>
<script>
    var ev = new EventSource('/time');
    ev.addEventListener('time', function (result) {
        document.getElementById("clock").innerHTML += '<h4>' + result.data + '</h4>'
    })
</script> 
</html>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM