Dave
Dave

Reputation: 427

Is it possible to post data to couch db and return data?

For example I would like to send the users score to the database and instead of it returning the typical status, id and rev I would like it to return the users rank. I'm guessing this isn't possible but figured I would ask.

Upvotes: 0

Views: 773

Answers (2)

Hans
Hans

Reputation: 2910

The response to an HTTP POST/PUT should really only be used to help you confirm that it succeeded.

I'm even struggling to see even how you can get the rank of a user returned by a couchdb view, unless you retrieve the data for all users and work out the position of your user.

This use case ...

  • Simple structured data clearly tabular
  • The requirement to respond fast to a numerical column (Method to calculate the rank for a score)
  • OR the requirement to trigger an update a score table each time a rank is submitted.

... very much smells like a classical case where you may want to use a relational DB.

Upvotes: 1

skiqh
skiqh

Reputation: 475

If the result can be calculated from the document you are to change with your http request, then you can use an update handler to PUT a change to the document and return that result:

// 'myhandler' update function
function(doc, req) {
  // create a shorthand for json reponses
  var json_reponse = function(obj, code) {
    return { 
        headers: { 'Content-Type': 'application/json' }
      , body: JSON.stringify(obj) 
      , code: code
      }
  }

  // assume the incoming body is json and parse it
  // needs proper error handling still
  var body = JSON.parse(req.body)

  // doc is the user document we are patching
  // return an error if it isn't there
  if(!doc) 
    return [null, json_response({error: 'user document not found'}, 404)]

  // return an error if new_score is missing from body
  if(!body.new_score) 
    return [null, json_response({error: 'missing property new_score'}, 400)

  // now patch the user doc
  doc.score = body.new_score

  // calculate the new rank depending on your own method
  var my_rank = my_rank_function(doc.score, Math.PI, 'bananarama')

  return [doc, json_response({success: true, rank: my_rank}, 200)
}

Now PUT new data to receive the new rank:

request(
  { method: 'PUT'
  , url: httptp://127.0.0.1:5984/mydb/_design/myddoc/_update/myhandler/myuserdocid
  , json: {"new_score": 42}
  , headers: { "Content-Type: application/json" }
  }
, function(err, response, body) {
    console.log("user's new rank:", JSON.parse(body).rank)
  }
)

should print user's new rank: LEVEL 11 EIGHTIES GIRL GROUP LEADER

nb: I'm not at work so cannot confirm the code works, but you should get the hang of it...

Upvotes: 0

Related Questions