所以我一直在摆弄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对象。我在你的代码中看到的两个问题是:
-
你在
BloggerService.js
中分配一个值给你的回调,而不是实际上调用回调:cb = client.blogger.posts.list(opts)
应该是(基于对谷歌API文档的快速扫描)client.blogger.posts.list(opts).execute(cb)
,如果出现错误,cb = null
应该是cb(err)
。 -
你正在分配一个值给响应对象,而不是发送一个响应:
res = blogPosts
应该是res.json(blogPosts)
。
至于在哪里/什么时候调用服务,文档并不想显得傲慢。这些服务是全球化的,因此可以在任何控制器内的任何地方调用它们;这取决于你作为开发人员来决定你需要你的服务调用在哪里!