gpt4 book ai didi

javascript - 即使客户端没有提供回调,有没有办法从服务器发送响应?

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:12 25 4
gpt4 key购买 nike

问题澄清

当我们使用 .emit().send() 并且我们还想确认消息接收(所谓的 acknowledgements )时,我们只需编写如下内容:

socket.emit('someEvent', payload, callback);

这个问题的全部内容是回调部分。这是很棒的东西,因为它通常允许发送回一些数据作为响应,而不会发出额外的事件。服务器所需要做的就是以正确的方式处理请求:

socket.on('someEvent', (payload, callback) => { 
doSomeStuff();
callback(someData);
);

当我们处理成功案例时,这非常有效。但遇到这些情况我们该怎么办:

1) 回调不是从客户端发送的/回调不是函数,并且需要从服务器端响应类似'错误:没有提供回调。用法:...'

示例:

客户端 - socket.emit('someEvent');socket.emit('someEvent', 1);

服务器端 - socket.on('someEvent',callback => callback());

2) 在处理请求时出现问题(例如验证结果不成功),我们需要以如下方式报告此情况:“未提供有效负载或无效”

示例:

服务器端 -

socket.emit('someEvent', payload, callback => { 
checkPayload();
callback(someData);
});

客户端 - socket.on('someEvent', invalidPayload, callback);

问题:是否有一种机制可以从响应者端创建自定义回调?

我的工作方式和解决方法

1)至于丢失的回调或不是函数的回调,我得出的结论是我只能验证它,然后仅在其有效性的情况下调用它。所以服务器端正在发生一些变化:

socket.emit('someEvent', 回调 => 回调实例函数 && 回调());//检查回调的正确性

优点:如果回调不是预期的函数,则不会出现内部错误。

缺点:如果回调无效,客户端将不会被注意到。

2)至于我们需要发回一些错误的情况,我只找到了一种解决方法来返回一个特定的、事先商定的虚假值,例如 null ,这意味着无法返回任何数据。

socket.emit('someEvent', payload, callback => {  
checkPayload();
callback(someData || null); //send falsy, error-like value instead
});

优点:客户端将通过获取 null 来注意到一些错误。

缺点:从服务器端来看,没有简单的中间件函数可以验证输入数据并执行主要逻辑之前返回错误。

我考虑过使用中间件来实现所需的功能,但是可以说,还没有“事件级中间件”,只是总体而言 namespacesocket水平。我是否应该尝试在套接字级别按事件名称过滤事件以附加所需的功能并以 next(new Error(...)); 之类的方式发送错误?在这种情况下,我猜可能需要使用 error 事件监听。

<小时/>

socket.io/socket.io-client使用的版本:2.3.0

最佳答案

1) Callback was not sent from the client side / callback's not a function and there's a need to respond from the server side with something like 'Error: no callback is provided. Usage: ...'

客户端和服务器必须就如何执行此操作达成一致。如果客户端不提供回调,则服务器参数将为未定义,以便您可以从服务器检测到它。

所以,正确的方法是这样的:

// client 
socket.emit('someMsg', someData, function(response) {
console.log(`Got ${response} from server`);
});

// server
io.on('connection', socket => {
socket.on('someMsg', (data, fn) => {
console.log(`Got data ${data} from client, sending response`);
// if client wants a response, send the response
if (fn) {
fn("got your data");
}
});
});

所以,如果客户端没有传递回调,那么服务器端的fn将是undefined。因此,在调用之前进行测试是正确的。

2) As for the case when we need to send some error back I've only found a workaround to return a specific, agreed in advance, falsy value like null so that it means that no data can be returned.

是的,您必须提前同意如何发回错误。发回错误的最简洁方法可能是将您的响应包装在一个对象中,并在该对象上使用 .error 属性。

// client 
socket.emit('someMsg', someData, function(response) {
if (response.error) {
console.log(`Got error ${response.error} from server`);
} else {
console.log(`Got data ${response.data} from server`);
}
});

// server
io.on('connection', socket => {
socket.on('someMsg', (data, fn) => {
console.log(`Got data ${data} from client, sending response`);
// if client wants a response, send the response
if (fn) {
// no error here
fn({error: null, data: "Got your message"});
}
});
});

您在这里看到的是,socket.io 并不是真正的请求/响应类型协议(protocol),socket.io 试图强行加入一些响应,您必须围绕该响应构建自己的结构。

或者,如果出现错误,您可以发送错误对象:

// server
io.on('connection', socket => {
socket.on('someMsg', (data, fn) => {
console.log(`Got data ${data} from client, sending response`);
// if client wants a response, send the response
if (fn) {
// send an error here
fn({error: new Error("xxx Error")});
}
});
});

From server side there's no simple middleware function that validates the input data and returns error before the main logic is being executed.

我真的不明白你想使用中间件来做什么或验证什么?此数据存在的唯一位置是在消息处理程序上,因此您想要对客户端发送的内容进行的任何服务器端验证都需要在那里。您当然可以在发送响应之前进行验证。

Shall I try to filter events by their names on the socket level to attach the needed functionality and send error in a way like next(new Error(...));? In this case there can be a work with error event listening, I guess.

Socket.io 不像 Express 那样工作,我真的不明白为什么你要尝试让它那样工作。接收 socket.io 消息时不涉及 next() ,因此我不确定您要在那里做什么。首次建立 socket.io 连接时有一个中间件选项,但不适用于通过该连接发送的后续消息。

Is there a way to send response from server even if no callback is provided from client side?

如果客户端不提供回调,则将响应发送回客户端的唯一方法是发送另一条消息。但是,发送响应的全部意义在于,如果您有一个正在监听并期待响应的合作客户端,那么如果客户端想要响应,也可以使用回调。如果客户端不想要响应并且不会编写任何代码来接收响应,那么您对此无能为力。

关于javascript - 即使客户端没有提供回调,有没有办法从服务器发送响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60254402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com