angular / in-memory-web-api

The code for this project has moved to the angular/angular repo. This repo is now archived.
MIT License
1.18k stars 231 forks source link

Extending InMemorDataService #219

Open 72gm opened 5 years ago

72gm commented 5 years ago

This may be a HowTo rather than an issue.

The company I am working for doesn't follow a restful pattern e.g. api/courses/abc doesn't return a course... it actually returns a wrapped object with a course inside

This is along the lines of {"operationSucceeded": true, "data": data, "notifications": []}

This causes an error as the item can't be found in the collection (because the collection is a level down)

e.g. collection.data rather than collection

Ok. So I have extended the service and used the get(reqInfo: RequestInfo) {} method

I have set const collection = reqInfo.collection.data;

It then finds the object correctly but I need to wrap this back up in the same object format. So i do

const options: ResponseOptions = data ? { body: {"operationSucceeded": true, "data": data, "notifications": []},
status: STATUS.OK } : { body: { error: 'id='${id}' not found }, status: STATUS.NOT_FOUND };

(As shown in your hero-in-mem-data-override.service.ts)

The built options look ok but my http subscription callback blows up with the following

"TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable"

Do you have any advice? Am I creating the body wrong?

vishal423 commented 5 years ago

Did you check this example: https://github.com/angular/in-memory-web-api/blob/master/src/app/hero-in-mem-data-override.service.ts#L57

72gm commented 5 years ago

In case someone comes across this issue:

I'd looked at that and successfully intercepted and manipulated the data (as mentioned above)... but it blew up on return to the subscriber..

the way to get round this is by adding a return type of Observable

get(reqInfo: RequestInfo):Observable<Response>

then return as so

let responseOptions = this.finishOptions(options, reqInfo);
    return reqInfo.utils.createResponse$(() => responseOptions);