socket.io无法在快速app.post回调中发出

时间:2016-06-16 23:08:16

标签: javascript node.js express socket.io

我有一个快速应用程序,它打开了我的前端React应用程序的套接字连接。

每当有人使用json数据向我的服务器发送post请求但socket.emit没有在a.post回调中触发时,我想向连接的套接字发出一个事件。但是io.sockets.emit工作正常但在这种情况下对我没用。

这失败了:

io.on('connection', (socket) => {
    app.post('/event', (req, res) => {
        socket.emit('someevent', req.body);
        res.sendStatus(200);
    }
}

但这传递了:

io.on('connection', (socket) => {
    app.post('/event', (req, res) => {
        io.sockets.emit('someevent', req.body);
        res.sendStatus(200);
    }
}

1 个答案:

答案 0 :(得分:2)

SLaks的评论是正确的,但它无法解决我的问题。

我最终做的是:

  1. 在从客户端发送到public class MyAppWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { String str=new String(url); if(str.endsWith("comx")){ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); Uri videoUri = Uri.parse(url.replace("?comx", "")); intent.setClassName("com.mxtech.videoplayer.ad","com.mxtech.videoplayer.ad.ActivityScreen"); intent.setDataAndType(videoUri, "application/x-mpegURL"); intent.putExtra("secure_uri", true); intent.putExtra("title", "Kung Fury"); intent.setPackage("com.mxtech.videoplayer.ad"); view.getContext().startActivity(intent); //view.goBack(); return true; } else { if(str.endsWith("covlc")){ Uri uri = Uri.parse(url.replace("?covlc", "")); int vlcRequestCode = 42; Intent vlcIntent = new Intent(Intent.ACTION_VIEW); vlcIntent.setComponent(new ComponentName("org.videolan.vlc", "org.videolan.vlc.gui.video.VideoPlayerActivity")); vlcIntent.setDataAndType(uri, "video/*"); vlcIntent.putExtra("title", "Kung Fury"); vlcIntent.putExtra("from_start", false); vlcIntent.putExtra("subtitles_location", "/sdcard/Movies/Fifty-Fifty.srt"); view.getContext().startActivityForResult(vlcIntent, vlcRequestCode); return true; } else { //Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); //view.getContext().startActivity(intent); return false; } } } } 的帖子请求中,我添加了一个包含套接字连接ID的隐藏输入字段。
  2. 然后在我的/event路由处理程序中,我做了:

    /event
  3. 这是有效的,因为默认情况下,每个套接字连接都会连接一个用socket-id标识的房间,并且可以使用app.post('/event', function(req, res) { io.sockets.in(req.body.socketId).emit('someevent', req.body); res.sendStatus(200); }); 对象自己将消息发送到房间(无需从io获取套接字对象