修正:SailsJs +谷歌博客是超时



所以我一直在摆弄SailsJs,到目前为止我真的很喜欢它,但我正试图从我自己的博客上拉帖子到一个视图。这有点问题,因为在尝试获取索引视图时连接超时,并且控制台没有通过console.log条目获得反馈。

博客服务
// 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);
            };
    });
};

调用控制器中的服务。之所以令人沮丧,是因为文档的底部以一种非常随意的方式说明了在哪里/如何调用服务。

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>

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

更新

非常感谢Scott,他让我离最终结果更近了一步。这就是我到目前为止所做的,但只需要清除与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);
            };
    });
};

看起来您可能是Node.js的新手,所以您可能想要阅读Node的异步编程以及Express使用的req和res对象。我在你的代码中看到的两个问题是:

  1. 你在BloggerService.js中分配一个值给你的回调,而不是实际上调用回调:cb = client.blogger.posts.list(opts)应该是(基于对谷歌API文档的快速扫描)client.blogger.posts.list(opts).execute(cb),如果出现错误,cb = null应该是cb(err)

  2. 你正在分配一个值给响应对象,而不是发送一个响应:res = blogPosts应该是res.json(blogPosts)

至于在哪里/什么时候调用服务,文档并不想显得傲慢。这些服务是全球化的,因此可以在任何控制器内的任何地方调用它们;这取决于你作为开发人员来决定你需要你的服务调用在哪里!

相关内容

  • 没有找到相关文章

最新更新