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

时间:2015-03-29 10:25:02

标签: javascript mysql node.js push-notification

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

2 个答案:

答案 0 :(得分: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` )
);
  

// 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");
});
  

// 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>

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

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

由于

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

  1. connection.release()代码最终无法读取且无法正常工作。你应该彗星或将它移除。
  2. 2.我案例中的实际输出: daniel adenew software engineer

答案 1 :(得分:2)

你可以通过两种方式做到:

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