Estoy usando tusdotnet de tus.io en la aplicación ASP.NET Core, estoy tratando de enviar una respuesta personalizada ya que estoy colocando las entradas en la base de datos y necesito enviar la Id de la base de datos en la respuesta. En el lado de javascript, después de que el archivo se carga correctamente, la respuesta siempre es nula.
onSuccess: function (response) { try { console.log(response); // this part is always null. even if the json response was received in the final network call. } catch (e) { console.log('Error onSuccess: ', e); } }Necesito recuperar la respuesta.
https://github.com/tus/tus-js-client/blob/master/docs/api.md
Resulta que tusdotnet de forma predeterminada envía un código de estado de respuesta como 204 No Content , lo que significa que mi respuesta fue ignorada desde la propia biblioteca.
Tuve que cambiar el HttpContext.Response de la configuración Tus para enviar el código de estado como 200 OK para devolver la respuesta desde la aplicación asp.net core . Por ejemplo, en mi evento OnFileCompleteAsync tuve que cambiar el código de estado predeterminado (204 No Content) a 200 OK :
ctx.HttpContext.Response.StatusCode = StatusCodes.Status200OK; await ctx.HttpContext.Response.WriteAsJsonAsync(new FileUploadResponseModel() { FileName = "Modified File Path", Path = "Extra info regarding the path", FileId = "Database Id" }, ctx.CancellationToken); Para capturar la respuesta en la devolución de llamada onSuccess :
onSuccess: function (response) { try { console.log(response); // This method should have the response after below changes } catch (e) { console.log('Error onSuccess: ', e); } } Tuve que modificar la biblioteca de javascript para emit correctamente la respuesta, ya que la implementación de 204 No Content se modificó a 200 OK . La función responsable de manejar este cambio fue _emitSuccess :
function _emitSuccess() { if (this.options.removeFingerprintOnSuccess) { // Remove stored fingerprint and corresponding endpoint. This causes // new uploads of the same file to be treated as a different file. this._removeFromUrlStorage(); } if (typeof this.options.onSuccess === 'function') { this.options.onSuccess(); } }Tuve que modificar el método anterior para:
function _emitSuccess(res) { if (this.options.removeFingerprintOnSuccess) { // Remove stored fingerprint and corresponding endpoint. This causes // new uploads of the same file to be treated as a different file. this._removeFromUrlStorage(); } if (typeof this.options.onSuccess === 'function') { this.options.onSuccess(res); } } Después de realizar este cambio, tuve que modificar todos los lugares donde se ejecutaba esta devolución de llamada para pasar la respuesta. Como en la devolución de llamada _handleUploadResponse :
this._emitSuccess(res); // pass on the response received in the handler.Del mismo modo, necesitaba modificar todos los lugares en los que se estaba consumiendo.
CDN: https://cdn.jsdelivr.net/npm/tus-js-client@latest/dist/tus.js