- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我们使用 .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
来注意到一些错误。
缺点:从服务器端来看,没有简单的中间件函数可以验证输入数据并在执行主要逻辑之前返回错误。
我考虑过使用中间件来实现所需的功能,但是可以说,还没有“事件级中间件”,只是总体而言 namespace和 socket水平。我是否应该尝试在套接字级别按事件名称过滤事件以附加所需的功能并以 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/
谁能解释一下 Server.MapPath(".")、Server.MapPath("~")、Server.MapPath(@"之间的区别\") 和 Server.MapPath("/")? 最佳答案
我不知道,为什么我们要使用 Server.UrlEncode() & Server.UrlDecode()?!在 QueryString 中我们看到 URL 中的任何内容,那么为什么我们要对它们进行编
我已经通过 WHM 在我的一个域上安装了 ssl 证书。网站正在使用 https://xyz.com . 但是它不适用于 https://www.xyz.com .我已经检查了证书,它也适用于 www
我已经使用 WMI 检测操作系统上是否存在防病毒软件,itz 正常工作并通过使用命名空间向我显示防病毒信息,例如 win xp 和 window7 上的名称和实例 ID:\root\SecurityC
我们有 hive 0.10 版本,我们想知道是否应该使用 Hive Server 1 或 Hive Server2。另一个问题是连接到在端口 10000 上运行的 Hive 服务器,使用 3rd 方工
我想在 C++ 中使用 Windows Server API 设置一个 HTTPS 服务器,我使用了示例代码,它在 HTTP 上工作正常,但我就是不能让它在 HTTPS 上工作。 (我不想要客户端 S
我写了一个非常基本的类来发送电子邮件。我用 smtp 服务器对其进行了测试,它工作正常,但是当我尝试使用我公司的交换服务器时,它给出了这个异常: SMTP 服务器需要安全连接或客户端未通过身份验证。服
我的应用程序包含一个“网关”DataSnap REST 服务器,它是所有客户端的第一个访问点。根据客户端在请求中传递的用户名(基本身份验证),请求需要重定向到另一个 DataSnap 服务器。我的问题
我有一个 Tomcat 服务器和一个 Glassfish4 服务器。我的 Servlet 在 Tomcat 服务器上启动得很好,但在 Glassfish4 服务器上给我一个“HTTP Status 4
我在 vmware 上创建了一个 ubuntu 服务器。我用它作为文件服务器。如果我通过托管虚拟机的计算机进行连接,则可以访问它。我无法从同一网络上的其他计算机执行此操作。提前致谢! 最佳答案 首先确
如何重启 Rails 服务器?我从 开始 rails server -d 所以服务器是分离的 我知道的唯一方法就是去做ps 辅助 | grep rails 并 kill -9关于过程#但是像这样杀死进
我实际上正在尝试找到编写一个简单的 XMPP 服务器的最佳方法,或者找到一个占用空间非常小的服务器。我只关心XMPP的核心功能(状态、消息传递、群组消息传递)。目前还在学习 XMPP 协议(proto
我实际上正在尝试找到编写简单 XMPP 服务器的最佳方法,或者找到一个占用空间非常小的方法。我只关心 XMPP 的核心功能(统计、消息、组消息)。目前也在学习 XMPP 协议(protocol),所以
我们正在尝试从 Java JAX-RS 适配器访问 SOAP 1.1 Web 服务。 我们正在使用从 WSDL 生成的 SOAP 客户端。 但是当解码 SOAP 故障时,我们得到以下异常: ... C
目前,我和许多其他人正在多个平台(Windows、OS X 和可能的 Linux)上使用 Python HTTP 服务器。我们正在使用 Python HTTP 服务器来测试 JavaScript 游戏
我有一个连续运行的服务器程序(C#/.NET 2.0 on Linux with mono),我想从 PHP 脚本连接到它以在网站上显示状态信息。 目的是创建一个(某种)实时浏览器游戏(无 Flash
所以我有一个单页客户端应用程序。 正常流程: 应用程序 -> OAuth2 服务器 -> 应用程序 我们有自己的 OAuth2 服务器,因此人们可以登录应用程序并获取与用户实体关联的 access_t
我们刚刚将测试 Web 服务器从 Server 2008 升级到 Server 2012 R2。我们有一个部署我们网站的批处理脚本。当它将站点推送到服务器时,它现在失败了。奇怪的是,我可以使用相同的发
建议一些加载SpagoBI服务器的方法,我尝试了所有方法来解析spagobi服务器。在 Catalina 中,错误是 - * SEVERE: Unable to process Jar entry [
当我们点击应用程序服务器(apache tomcat)时,它会创建一个线程来处理我们的请求并与 tomcat 连接,建立连接,tomcat 创建另一个线程来处理请求并将其传递给连接,连接线程将其传递给
我是一名优秀的程序员,十分优秀!