【问题标题】:Execute module after POST requestPOST 请求后执行模块
【发布时间】:2017-11-13 10:24:36
【问题描述】:

我正在尝试集成通过套接字发送实时信息(使用 socket.io)和使用 OneSignal 平台发送推送通知。

碰巧如果我把所有东西都放在同一个模块中,我不知道为什么在发送信息之后,或者在发送信息之前没有执行发送通知的方法。

如果我运行命令 npm start 不会出现错误,但通知会在本地或远程服务器运行时立即到达,这样我不希望它发生。

user.js

  var express = require('express');
var router = express.Router();
var misocket = require('../routes/misocket');
var notificacion = require('../routes/notificacion');

/*

run module when start server run, i don't want it

notificacion();

*/ 

/* GET users listing. sendnote*/
router.post('/sendasig', function(req, res, next) { 


    console.log(misocket);//registrednote
    misocket.emit("registrar",req.body);  
  //run here, after the send data across post request
  notificacion();
    console.log(req.body);

  res.status(200).json({
      message  : "send message"
  }); 

});

module.exports = router;

notificacion.js

 module.exports = function(){ 

        var OnesignalNotificationApi = require('onesignal-notification');
        var api = new OnesignalNotificationApi('N2FkY2ZkZWQtMGQ2MS00ZTUwLTlkM2QtODA2NmE0YjBiMzQ3',
                                        'c4b92cce-4d59-4550-a4be-20939370e39c');

        var message = {
                it: 'Some message',
                en: 'Some message',
                es: 'Nueva Calificacion'
        };

        api.sendToAll(message, null, function(err, res){
                console.log(err);
                console.log(res);
        }); 

}; 

index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

misocket.js

var i = 0;
var ioapp;

exports.connection= function(io){

    ioapp = io;

    io.on('connect',function(s){
        console.log("Conectado");    
    });

};

exports.io = ioapp;

【问题讨论】:

    标签: javascript node.js express push-notification


    【解决方案1】:

    用下面的代码替换你的 notification.js

     module.exports = function(){ 
    
        var sendNotification = function (data) {
        var headers = {
            "Content-Type": "application/json; charset=utf-8",
            "Authorization": "Basic N2FkY2ZkZWQtMGQ2MS00ZTUwLTlkM2QtODA2NmE0YjBiMzQ3"
        };
    
        var options = {
            host: "onesignal.com",
            port: 443,
            path: "/api/v1/notifications",
            method: "POST",
            headers: headers
        };
    
        var https = require('https');
        var req = https.request(options, function (res) {
            res.on('data', function (data) {
                console.log("Response:");
                console.log(JSON.parse(data));
            });
        });
    
        req.on('error', function (e) {
            console.log("ERROR:");
            console.log(e);
        });
    
        req.write(JSON.stringify(data));
        req.end();
    };
    
    var message = {
        app_id: "c4b92cce-4d59-4550-a4be-20939370e39c",
        contents: {"en": "sample message"},
        included_segments: ["All"]
    };
    
    sendNotification(message);
    
    }; 
    

    【讨论】:

    • 好的,等一下
    • 告诉我这个错误,Response: { errors: [ 'You must include which players, segments, or tags you wish to send this notification to.' ] }
    • 不发送通知,我不知道发生了什么
    • 我没找到你
    • 我不知道第一次和之后如何工作。
    【解决方案2】:

    在您的 notification.js 文件中,将在需要该文件时执行 sendToAll 函数(这可能是在您运行时。)

    api.sendToAll(message, null, function(err, res){
        console.log(err);
        console.log(res);
    }); 
    

    您将希望将其包装在一个函数中并在您的 post 路由中调用它。

    module.exports = function(message){ 
      api.sendToAll(message, null, function(err, res){
         console.log(err);
          console.log(res);
       }); 
    }
    

    然后可以在服务器顶部需要它

     const sendMessageFunction = require('path/to/notification.js')
     .
     .
     .
     sendMessageFunction('helloWorld')
    

    【讨论】:

    • C:\Users\PterPmntaM\AplicacionesNode\enviarHorarios\routes\notificacion.js:12 modules.exports = function(message){ ^ ReferenceError: modules is not defined
    • 我打错了,应该是 module.exports 而不是 modules.exports
    • 我是节点新手,我正在尝试解决这个问题,但我不能
    • 错误是notification.js第12行应该是module.exports = function(message)而不是'modules.export'
    • 不显示任何错误,但对推送通知不起作用,其他解决方案?
    【解决方案3】:

    您是否尝试将 user.js 编辑成这样:

    var express = require('express');
    var router = express.Router();
    var misocket = require('../routes/misocket');
    var notificacion = require('../routes/notificacion');
    
    var OnesignalNotificationApi = require('onesignal-notification');
    var api = new OnesignalNotificationApi('N2FkY2ZkZWQtMGQ2MS00ZTUwLTlkM2QtODA2NmE0YjBiMzQ3',
                                        'c4b92cce-4d59-4550-a4be-20939370e39c');
    
    
    /* GET users listing. sendnote*/
    router.post('/sendasig', function(req, res, next) { 
        console.log(misocket);//registrednote
        misocket.emit("registrar",req.body);  
        //run here, after the send data across post request
        notificacion(api);
        console.log(req.body);
    
        res.status(200).json({
            message  : "send message"
        }); 
    });
    
    module.exports = router;
    

    和 notification.js 是这样的:

    module.exports = function(api){ 
    
        var message = {
                it: 'Some message',
                en: 'Some message',
                es: 'Nueva Calificacion'
        };
    
        api.sendToAll(message, null, function(err, res){
                console.log(err);
                console.log(res);
        }); 
    
    };
    

    【讨论】:

    • 朋友解决了,比较复杂,问题从app.js文件开始
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2023-04-03
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多