仔细阅读文档,但没有运气。我正在尝试向单个客户端/用户而不是每个用户发送邮件。
我阅读了有关此问题的其他几个问题,大多数问题都没有答案或指向较旧的解决方案。任何帮助将不胜感激。
以下内容有效,但发给网站上的所有人,而不是单个用户...
服务器:
//Socket.io
const http = require('http').Server(app);
const io = require('socket.io')(http);
app.post('/login', (req, res) => {
const email = cryptonize.encrypt(req.body.email);
const password = cryptonize.encrypt(req.body.password);
io.emit('login success', email, password);
});
客户:
const socket = io();
socket.on('login success', (user, token, auth) => {
console.log(`user:${user}, password:${password});
});
我已经尝试过socket.io备忘单中提到的“ socket.emit”,但是它在服务器上以未定义的形式返回。可能我真的很想念一些简单的东西,只是没看到它。
答案 0 :(得分:3)
我不认为这是socket.io的预期用途。
对于您来说,一个简单的res.end(...)
即可(至少根据您向我们展示的内容)。
app.post('/login', (req, res) => {
const email = cryptonize.encrypt(req.body.email);
const password = cryptonize.encrypt(req.body.password);
res.end(/* data */);
});
阅读关于res.end()
的{{3}}。
如果您确实需要发射到单个插座,则需要做更多的工作:
下面是使用默认名称空间的示例:
服务器
const IO = require('socket.io');
const io = IO(server);
// Default namespace is '/'
const namespacedIO = io.of('/');
io.on('connection', socket => {
socket.on('send', data => {
const targetSocket = namespacedIO.connected[data.socketID];
targetSocket.emit('received', data.value);
});
});
客户
const socket = io();
submit.addEventListener('click', function(){
socket.emit('send', {
socketID: socket.id, // IMPORTANT: to get the source socket ID
value: input.value
});
})
socket.on('received', function(data){
console.log(`Data "${data}" is received at server.'`);
});
答案 1 :(得分:2)
这就是我最后要做的,对于其他试图弄清楚这一点的人。
服务器:
//Socket.io
const http = require('http').Server(app);
const io = require('socket.io')(http);
app.post('/login', (req, res) => {
const email = cryptonize.encrypt(req.body.email);
const password = cryptonize.encrypt(req.body.password);
const socketid = req.query.socket;
io.sockets.connected[socketid].emit('login success', email, password);
});
客户:
const socket = io();
let socketid;
socket.on('connect', () => socketid = socket.io.engine.id);
客户续..
然后,我在帖子生成时为其添加了一个“ socketid”查询。
//XHR Setup
const xhr = new XMLHttpRequest();
let response, status, readyState;
xhr.onreadystatechange = () => {
if (xhr.status === 200 && xhr.readyState === 4) response = xhr.response;
};
//XHR POST
const post = ({ url, callback, data }) => {
xhr.open('POST', `${url}&socketid=${socketid}`, true), xhr.setRequestHeader('Content-type', 'application/json'), xhr.send(data);
if (callback) callback();
console.log(`${url}&socketid=${socketid}`);
}