修复:SailsJs + Google Blogger超时

时间:2014-03-20 22:03:57

标签: google-api blogger sails.js

所以我一直在修补SailsJs并且到目前为止非常喜欢它,但我试图从我拥有的博客中删除帖子。这有点问题,因为尝试获取索引视图时连接超时,并且控制台没有通过console.log条目提供反馈。

Blogger服务

// BloggerService.js - in api/services
var g = require('googleapis');
var apiKey = 'OUche33eekym0nKEY-uME';

exports.getBlogPosts = function(options, cb) {
    g.discover('blogger', 'v3').execute(function(err, client) {
            if(err) {
                    cb = null;
                    return console.log(err);
            } else {
                    var opts = { 'blogId': options.id, 'maxResults': options.limit, 'fields': 'items(title,content,url)' };
                    cb = client.blogger.posts.list(opts);
            };
    });
};

exports.getBlogPost = function(options, cb) {
    g.discover('blogger', 'v3').execute(function(err, client) {
            if(err) {
                    cb = null;
                    return console.log(err);
            } else {
                    var opts = { 'blogId': options.id, 'postId': options.postId };
                    cb = client.blogger.posts.get(opts);
            };
    });
};

在控制器中调用服务。 Frustrating because the bottom of the documentation has a very cavalier way of saying where/how the service is called.

BlogController.js

/**
 * BlogController.js
 *
 * @description ::
 * @docs        :: http://sailsjs.org/#!documentation/controllers
 */

module.exports = {
    index: function(req, res){
            BloggerService.getBlogPosts({'id':'86753098675309','limit':6},function(err, blogPosts){
                    if(err){
                            return console.log(err);
                    } else {
                            console.log(blogPosts.items[0].url);
                            res = blogPosts;
                    };
            });
    }
}

索引视图

<div>
            <% _.each(Model.items, function (blogPost) { %>
                    <div class="panel panel-default">
                            <div class="panel-heading"><%= blogPost.title %></div>
                            <div class="panel-body"><%= blogPost.content %><input type="hidden" value="<%= blogPost.id %>"></div>
                    </div>
            <% }) %>
</div>

非常感谢任何帮助。谢谢你花时间看这个。

更新

非常感谢斯科特,他让我更接近最终结果。这是我到目前为止所做的,但只需要通过discover / apiKeys清除身份验证问题。

exports.getBlogPosts = function(options, cb) {
    g.discover('blogger', 'v3').execute(function(err, client) {
            if(err) {
                    cb(err);
            } else {
                    var opts = { 'blogId': options.id, 'maxResults': options.limit, 'fetchBodies': false, 'fields': 'items(title,url)' }
                    client.blogger.posts.list(opts).withApiKey(apiKey).execute(cb);
            };
    });
 };

exports.getBlogPost = function(options, cb) {
    g.discover('blogger', 'v3').execute(function(err, client) {
            if(err) {
                    cb(err);
            } else {
                    var opts = { 'blogId': options.id, 'postId': options.postId };
                    client.blogger.posts.get(opts).withApiKey(apiKey).execute(cb);
            };
    });
};

1 个答案:

答案 0 :(得分:1)

您可能不熟悉Node.js,因此您可能需要阅读asynchronous programming with Node和Express使用的req and res objects。我在你的代码中看到的两个问题就是:

  1. 您要在BloggerService.js中为回调分配值,而不是实际调用回调:cb = client.blogger.posts.list(opts)应该是(基于快速扫描) Google API文档)client.blogger.posts.list(opts).execute(cb),如果出现错误cb = null,则应为cb(err)

  2. 您正在为响应对象分配值,而不是发送回复:res = blogPosts应为res.json(blogPosts)

  3. 至于您何时/何时致电您的服务,文件并不打算成为骑士。这些服务是全球化的,因此可以从任何控制器内的任何地方调用它们;由您作为开发人员来决定您需要服务电话的位置!