通常(节点/快递)返回服务器错误并拒绝承诺的正确方法是什么?
A)喜欢这样:res.json({status: 1, message: 'Test missing phone.', error: 'phone'})
然后提取错误代码' error
中的messsage
以及前端error
之外的消息,导致履行承诺,其中包含message
和res.status(500)
res.json({message: 'Test missing phone.'})
。
B)喜欢这个;
message
然后只需将.reject
拉出来并使用该消息调用res.error
。或res.status(500).json({test: 'Test missing phone.'})
或其他。
这些中的任何一个都会导致“被拒绝”。承诺或错误'回调会使前端的东西更容易?
当我收到错误时,是否应该导致承诺/回调拒绝,或者只是发送一个在 A 等对象中出错的履行承诺?
其中哪一个是正确的'从服务器向前端返回错误的方法?
目前我使用方法A,但它似乎相当愚蠢,因为我必须处理错误两次,后端(实际发送自定义错误)和前端(检查履行的承诺是否有错误对象,然后显示弹出)。方法B将消除“检查履行的承诺是否具有错误对象”的问题。部分,因为被拒绝的承诺本质上是错误的。
编辑:我使用React Native作为前端。
EDIT2:如果你在后端console.log(error.response.data)
,你可以ActiveSheet
在前端制作" B"一个可行的选择。
答案 0 :(得分:2)
取决于您在前端使用的内容。如果它是Angular并且您正在使用File file = new File(filePath);
Log.d(TAG,"Calling update function");
update(file);
}
}
public void update(File file) {
Log.d(TAG,"I got called, yey!");
ApiInterface apiService = ApiClient.GetAuthClient(token).create(ApiInterface.class);
RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), reqFile);
RequestBody name = RequestBody.create(MediaType.parse("multipart/form-data"), "upload_test");
data.put("uname",username.getText().toString());
data.put("fname",firstname.getText().toString());
data.put("lname",lastname.getText().toString());
data.put("address",address.getText().toString());
data.put("password",password.getText().toString());
data.put("preferance1",String.valueOf(spinner1.getSelectedItem()));
data.put("preferance2",String.valueOf(spinner2.getSelectedItem()));
data.put("preferance3",String.valueOf(spinner3.getSelectedItem()));
Call<ResponseBody> call = apiService.UpdateUser(data,body,name);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
// Log error here since request failed
Log.e(TAG, t.toString());
}
});
}
对象,则根据What exactly is Type Coercion in Javascript?,如果存在错误状态(例如,$http
状态代码),则承诺将被拒绝。< / p>
因此,为了让前端自动“知道”何时出现错误(而不是必须进行额外的检查以查看正文是否包含错误消息),您应该采用400
方法在后端。 HTTP状态代码是您应该使用的模型,以便您的前端知道服务器中发生了什么,并且大多数前端HTTP库都是在考虑此模型的情况下构建的。
如果需要,您也可以在回复正文中发送其他信息。您可以在前端使用自定义应用程序代码来处理更细粒度的错误情况。例如,状态401将告诉客户端他们未经授权在服务器上执行某些操作,并且具有res.status()
成员的正文可能会进一步确定问题的确切位置以及一些人类可读的内容说明(在您的示例中已经为code
)。
答案 1 :(得分:0)
在最佳做法方面添加res.status(500)
是恰当的。如果您说您的服务器存在“错误”,你应该明确标记响应 - 即响应代码500,它恰好表明了。
虽然您知道期望的回复类型,但如果这是您正在与他人共同开发的项目或要向公众分享的API,那么不获得{{}似乎违反直觉1}}。发送500将使得使用promises或vanilla ajax更容易处理错误。
也就是说,没有理由你也不能包含你在A部分提到的完整JSON对象(即500
),以便为你的前端提供更多信息。