2015-11-13 3 views
2

Я работаю в SailsJS, и я пытаюсь создать REST API-интерфейс для моего мобильного приложения, что позволяет использовать путь Newsfeed, чтобы, если я запрошу JSON на front-end Я могу получить все это от www.website.com/user/id/Newsfeed. Где Контроллер получает друзей каждого пользователя и их сообщения и отображает его в JSON в хронологическом порядке по этому маршруту. Я исхожу из объективно-C-фона, который носит мою новичку.Как искать друзей в интерфейсе API для конкретного маршрута

config/routes.js

module.exports.routes = { 

    '/': { 
    view: 'homepage' 
    }, 

    'get /user/:id/newsfeed': { 
    controller: 'UserController', 
    action: 'newsfeed' 
    } 

};

Model/User.js

var User = module.exports = { 
    //User attributes 
    attributes: { 
     facebookId: 'string', 
     accessToken: 'string', 
     location: 'string', 
     email: 'string', 
     first_name: 'string', 
     last_name: 'string', 
     about: { 
      interests: 'string', 
      goals: 'strings', 
      headline: 'string', 
      birthday: 'date' 
     }, 
     friends : { 
      type: 'json' 
     }, 
     posts: { 
      collection: 'posts', 
      via: 'user' 
     }, 
     picture: 'string' 
    } 
}; 

controllers/UserControllers.js

module.exports = { 

    newsfeed: function(req, res) { 
     var userId = req.session.id.friends; 
     sails.log("Searching for user's friends: "+ userId); 

     User.find({ where: { userId: { equals: userId}}}).exec(function(err, records) { 
      if(records && records.length == 0) { 
       sails.log("No friends found for user:" + userId); 
       sails.log(err); 
       return res.json(404, "No Friends Found :'(, you'll have alot soon! You're too cool not to."); 
      } else { 
       var friendsPostsArray = []; 
        for (i = 0; i < records.length; i++) { 
         var friendsPosts =records[i].posts; 
         friendsPostsArray.push(friendsPosts); 
        } 
       var uniquePosts = friendsPostsArray.filter(function (item, i , ar) { 
        return ar.indexOf(item) === i; 
       }); 
       uniquePosts.sort(); 
       sails.log(uniquePosts); 
       sails.log("Returning" + records.length + "friends found for user:" + userId); 
       return res.json(200, {friends: records, posts: uniquePosts}); 

      } 
     }); 
    } 
}; 

ответ

1

Кажется, как будто вы должны хранить друзей как совокупность пользователей в модели:

friends: { 
    collection: 'user', 
    via: 'id' 
} 

И в контроллере, заполнить ваш запрос со своими друзьями и сообщениями так:

newsfeed: function (req, res) { 
    var userId = req.param('id'); 
    sails.log("Searching for user's friends: " + userId); 

    User.find({ userId: userId }) 
    .populate('friends') 
    .populate('posts') 
    .exec(function (err, found) { 
     /* Now we have a list of friends, we can find their posts */ 
     User.find({ userId: found.friends }) 
     .populate('posts') 
     .exec(function (err, found) { 
      /* Process friends posts here */ 
     }); 
    }); 
} 

EDIT: Добавлен код, необходимый для заполнения сообщений друзей.

+0

Это дает мне ошибку: throw new Error ('Попытка связать атрибут коллекции с моделью, у которой нет' + –

+0

. Можете ли вы опубликовать всю ошибку? В сущности, если она не подходит здесь. Просто протестировал код модели при новой установке, и он не дал мне никаких ошибок. –

+0

Извините, это говорит: [TypeError: Невозможно прочитать id свойства undefined]. Я полагаю, что это происходит в var userId = req –

0

Ответ оказался комбинацией ответа Фредерика и некоторого tweeking другим другом.

newsfeed: function (req, res) { 
    var userId = (req.param('id')); 
    sails.log("Searching for user's friends: " + userId); 

    User.find({ id: userId }) 
    .populate('friends') 
    .populate('posts') 
    .exec(function (err, found) { 

     if (err) return res.status(err).json(400); 
     res.json(200, {found}); 

    }); 
    } 

Но это все еще не полностью сделано, потому что это просто возвращает список друзей и сообщения пользователя: id пользователя. Я использовал param вместо session и изменил часть find(), поэтому я не знаю, могу ли я дать Фредерику зелёную проверку славы, но, безусловно, имеет мое преимущество. Надеюсь, это поможет любому младшему программисту!

+0

Легко, я отредактирую свой ответ haha. –

+0

вы заслуживаете Green brothah. –

+0

Yay интернет-очки. –