Jimmy
Jimmy

Reputation: 59

Falcor - HTTPDataSource to post Json

Is it possible to post a Json file using the falcor.browser's model? I have used the get method in it. Below is what I require, but it is not working.

<script src="./js/falcor.browser.js"></script>
function registerUser() {
  var dataSource = new falcor.HttpDataSource("http://localhost/registerUser.json");
  var model = new falcor.Model({
      source: dataSource
  });

var userJson = {"name":"John","age":"35","email":"[email protected]"};

model.
 set(userJson).
 then(function(done){
   console.log(done);
 });

This is the server.js code:

app.use('/registerUser.json', falcorExpress.dataSourceRoute(function (req, res) {
  return new Router([
    {
      route: "rating",
      get: function() {
           // Post call to external Api goes here
      }
    }
  ]);
}));

Upvotes: 0

Views: 331

Answers (1)

James Conkling
James Conkling

Reputation: 3673

A few things:

The Model's set() method takes 1+ pathValues, so reformat your userJson object literal into a set of pathValues. Something like:

model.
 set(
   { path: ['users', 'id1', 'name'], value: 'John' },
   { path: ['users', 'id1', 'age'], value: 35 },
   { path: ['users', 'id1', 'email'], value: '[email protected]' }
 ).
 then(function(done){
   console.log(done);
 });

Second, your router must implement set handlers to correspond to the paths you are trying to set. These handlers should also return pathValues:

  new Router([
    {
      route: 'users[{keys:ids}]["name", "age", "email"]',
      set: function(jsonGraph) {
          // jsonGraph looks like { users: { id1: { name: "John", age: 35, email: "[email protected]" }
          // make request to update name/age/email fields and return updated pathValues, e.g.
          return [
              { path: ['users', 'id1', 'name'], value: 'John' },
              { path: ['users', 'id1', 'age'], value: 35 },
              { path: ['users', 'id1', 'email'], value: '[email protected]' },
          ];
      }
    }
  ]);

Given that your DB request is likely asynchronous, your route get handler will have to return a promise or observable. But the above should work as a demonstration.

Edit

You can also use route pattern matching on the third path key if the number of fields gets large, as was demonstrated above on the second id key.

    {
      route: 'users[{keys:ids}][{keys:fields}]',
      set: function(jsonGraph) {
        /* jsonGraph looks like
           {
             users: {
               id1: { field1: "xxx", field2: "yyy", ... },
               id1: { field1: "xxx", field2: "yyy", ... },
               ...
            }
          }
        */
      }
    }

Upvotes: 0

Related Questions