Create a Node.js function for an HTTP PUT request for a Swagger API

Will Button
InstructorWill Button
Share this video with your friends

Social Share Links

Send Tweet
Published 7 years ago
Updated 5 years ago

This lesson will teach you how to update a Todo item in Elasticsearch when received from an HTTP PUT method in your API server built with Swagger.

[00:00] The last operation we've defined in our Swagger specification for our to-do API is this put operation. It allows us to update a single to-do by its ID. The parameters it requires on the URL path is the ID of the Todo to be updated, and then in the body is the updated Todo itself.

[00:23] The Swagger router controller looks for a file named updateTodo by ID, and it's going to try to implement a function called updateTodo by ID, let's build all of that. Inside my Controllers folder, I'll create a new file and we're going to call it updateTodo by ID according to our Swagger specification.

[00:42] I'm going to require my client, which is my Elasticsearch client that has the configuration details for talking to the Elasticsearch cluster, and I'll export the module and then create that function.

[00:59] The function has a request and response objects, and then, we'll call the client update method, specify in there the index and the type. The ID number of the Elasticsearch document we're going to be updating, and we're going to get that from the URL path, which can be found on request.swagger.params.id.value.

[01:28] The way the update for Elasticsearch works is there's a body and inside the body is a doc and that doc contains the updated document for your Elasticsearch cluster. We can find that as updatedTodo.value.

[01:42] It's worth noting there that the way we've built this is that the client is going to be expected to return the entire Todo back to the server, not just the fields that have changed, otherwise, it's just going to update the Todo, but only with the information that they send. We're going to provide a callback to that to check for when it's complete.

[02:02] Again, set our header to application/json. Then if that error object exists, we're going to set our status code that we send back as a 400 to indicate there was an error. Then, we'll send back the error itself. Otherwise, it means we have a successful operation. We can just end the response there.

[02:27] The last thing we need to do is test that it's working, I've used the Todo endpoint to bring up a single Todo of ID number one. I'll use the Swagger editor to do that and I've got the updated Todo filled out here, I can send that request and then refresh my page and the Todo has been updated.

Victor Hazbun
Victor Hazbun
~ 7 years ago

I got this when trying to do a PUT request to the API, I already installed and setup cors. Can you please help me getting this working? TY.

{"message":"Response validation failed: void does not allow a value","code":"INVALID_TYPE","failedValidation":true,"path":["paths","/todo/{id}","put","responses","200"],"originalResponse":"{}"}

Alberto
Alberto
~ 7 years ago

I was not able to end the response with res.end(). I got a JSON parsing error. So I sent back the response. Then I got Victor Alonso's error. I changed the swagger specs to:

       responses:
         200:
           description: "Todo updated"
           schema:
              title: reset
              properties:
                message:
                  type: string
        400:
           description: "Yikes! An error!"
  x-swagger-router-controller: "UpdateTodoById"

as indicated at http://stackoverflow.com/questions/34226739/implementing-a-void-in-swagger-documentation

What exactly am I doing??? Not clear :-(

Markdown supported.
Become a member to join the discussionEnroll Today