如何使用node.js在mysql数据库上实现推送通知系统

ham*_*med 7 javascript mysql push-notification node.js

我是全新的node.js,我想在MySql数据库上实现推送通知系统.我的数据库中有一个通知表.在此表中,我有存储recipient_id指定通知的收件人.现在我想要一个新的通知recipient_id等于当前登录用户的id通知该用户.例如,Stackoverflow如果您在java标记问题中,每次java创建带标记的新问题时,页面顶部都会显示通知:1 question with new activity. 抱歉,我的英文不好.请帮我实现这个系统,因为我是新手.

Din*_*aws 6

我已经制作了一个像你的要求的简单应用程序

您可以从以下代码行获得帮助.您需要了解代码的基础知识.之后,您将轻松实现目标.本演示应用程序中涵盖了您的要求中的大部分内容.

它不是一个确切的但你会通过这个达到你的目标.

在此示例中,任何用户的状态帖子也将同时向所有其他用户发出.我们可以操纵它来实现"1新状态".

在数据库中创建一个表,在其中保存要保存的条目CREATE TABLE status

(
    `status_id` INT NOT NULL AUTO_INCREMENT,
    `s_text` TEXT,
    `t_status` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     PRIMARY KEY ( `status_id` )
);
Run Code Online (Sandbox Code Playgroud)

//server.js

var app = require("express")();
var mysql = require("mysql");
var http = require('http').Server(app);
var io = require("socket.io")(http);

/* Creating POOL MySQL connection.*/

var pool = mysql.createPool({
    connectionLimit: 100,
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'fbstatus',
    debug: false
});

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


io.on('connection', function(socket) {
    console.log("A user is connected");

    socket.on('status added', function(status) {
        add_status(status, function(res) {
            if (res) {
                io.emit('new status', status);
            } else {
                io.emit('error');
            }
        });
    });
});

var add_status = function(status, callback) {
    pool.getConnection(function(err, connection) {
        if (err) {
            connection.release();
            callback(false);
            return;
        }
        connection.query("INSERT INTO `status` (`s_text`) VALUES ('" + status + "')", function(err, rows) {
            connection.release();
            if (!err) {
                callback(true);
            }
        });
        connection.on('error', function(err) {
            callback(false);
            return;
        });
    });
}

http.listen(3000, function() {
    console.log("Listening on 3000");
});
Run Code Online (Sandbox Code Playgroud)

//index.html

<html>
  <head>
    <title>Socket.io</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
    <script src = "http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    <script>
    $(document).ready(function(){
          var socket = io();
          $("#add_status").click(function(){
            socket.emit('status added',$("#comment").val());
          });

          socket.on('new status',function(msg){
              var count = $('#count_status').text();
              var valCount = parseInt(count);
              if(valCount>=1) {
                  valCount = valCount+1;
              } else {
                  valCount = 1;
              }
              var showMsg = '<div id="count_status"> '+valCount+' </div>  new status';
              $("#show_comments").html(showMsg);

          });
    });
    </script>
  </head>
  <body>
    <div id="comment_box" style = "padding:5%;">
      <textarea id="comment" rows="5" cols="70"></textarea><br /><br />
      <input type="button" id="add_status" value="Add">
    </div>
      <div id= "show_comments"  class = "jumbotron"></div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

使用以下命令节点Server.js运行应用程序

现在在浏览器中运行http:// localhost:3000 /并查看结果,打开一个新窗口,在该窗口中发布状态并在窗口中查看新状态通知.

谢谢

编辑:这是一个很棒的启动教程.有些事情需要修改.

  1. connection.release()代码最终无法读取且无法正常工作.你应该彗星或删除它.

2.我案例中的实际输出: daniel adenew软件工程师


Jea*_* S. 3

您可以通过两种方式进行:

  • 每 n 秒向服务器查询一次是否有新消息。将上次检查的时间戳作为参数传递,如果自上次检查以来有任何通知,则以 json 形式返回并将其显示在客户端中。这称为拉动策略。
  • 或者您可以使用websockets它来维护客户端和服务器之间的永久连接,然后您可以从服务器代码实时向客户端发送通知。请参阅socket.io教程。这称为推送策略。

  • 感谢你的回复。我知道解决方案是socket.io。但我的问题是“如何”实时实现它。 (3认同)