很快就会明白,我以前从未认真编写过Web服务器
这是当前情况:
我的端点是用TypeScript中的Express编写的
class ChatRequest {
public uid: string;
public message: string;
}
export const register = (app: express.Application, deps: dependencies.IDependencies) => {
app.post("/sendChat", (req: express.Request, res: express.Response) => {
transformAndValidate(ChatRequest, req.body)
.then((sendGlobalChatRequest: SendGlobalChatRequest) => {
const payload = {
message: sendGlobalChatRequest.message,
uid: sendGlobalChatRequest.uid
};
//Check if uid is banned here
//Check if payload passes language filter here
//Save Payload here
res.sendStatus(200);
}, (err) => {
deps.logger.error(err);
res.sendStatus(503);
});
});
我一直在使用本文作为参考: https://hackernoon.com/the-request-sent-bad-data-whats-the-response-94088bd290a
但是我认为我的结论是他们正在讨论一些稍有不同的事情。
因此,据我了解,我可以组成HTTP代码...
因此如果禁止使用uid,我可以res.sendStatus(499);
进行操作,如果有效载荷未通过语言过滤器,则可以res.sendStatus(498);
进行操作
然后我的客户只需阅读Int
statusCode
并快速确定故障。
但是,即使我认为我可以做到,而且行得通,这似乎也不对吗?
我应该使用标准的HTTP响应代码吗? https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
然后在响应的正文中添加String
或我的客户端可以解析以确定错误的内容?
String解析似乎很难维护,但从技术上讲,如果可行的话,看起来更“合法”?
让我的客户确定服务器端错误类型的最佳方法是什么?
答案 0 :(得分:0)
我决定返回JSON映射错误到布尔值400
if (isProfane(message)) {
res.status(400).json({messageContentBlocked: true});
}
通过这种方式,客户端可以一次收到针对该请求的多个错误,并且更加明确
万一有人在搜索,我正在使用RxSwift / RxCocoa
这是我在客户端上处理错误的方法:
extension Error {
var chatMessageBlockedURLError: Bool {
guard let rxCocoaURLError = self as? RxCocoaURLError else {return false}
switch rxCocoaURLError {
case let .httpRequestFailed(response, data):
guard response.statusCode == 400, let data = data else {return false}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .millisecondsSince1970
guard let errors = try? decoder.decode([String:Bool].self, from: data) else {return false}
return errors["messageContentBlocked"] == true
default:
return false
}
}
}