【问题标题】:The SailsJS way of connecting to an API. What's the best method?SailsJS 连接到 API 的方式。最好的方法是什么?
【发布时间】:2014-10-09 22:43:51
【问题描述】:

我目前正在尝试连接到Artsy public API,但遇到了一些问题。请放轻松,我是 NodeJS 和 SailsJS 的新手。我创建了一个名为 api/services/Artsy.js 的文件,现在我对我的方法(见下文)是否真的是 Sails 的做事方式感到困惑。这是一个问题。如果不是,那么在 SailsJS 中设置对 API 的基本调用的正确方法是什么?或者更具体地说,到 Artsy API?

想到的问题:

  • 我需要等到获取令牌后才能调用需要它的 API 方法。这是通过 pubsub 还是其他一些技术完成的。是否有任何实际示例说明这在 SailsJS 中是如何工作的?

  • 可以在视图中使用服务调用吗?如何?这甚至有意义吗?似乎它可能对 API 调用有用。

注意:我已经设置了包含重要变量的文件 config/artsy.js。 (见下文)

/api/services/Artsy.js

/**
*
* Artsy.js => in api/services
* @description A service that connects to the Artsy.net public API.
* @url https://developers.artsy.net/
**/
var request = require('superagent'),
 	traverson = require('traverson'),
 	xappToken;

module.exports = {
	
	init: function(){

		sails.log.info('----- Artsy API Initialized -----');

		var clientID = sails.config.artsy.clientId,
		    clientSecret = sails.config.artsy.clientSecret,
		    apiTokenUrl = sails.config.artsy.apiTokenUrl;

		try{ 

			request
				.post(apiTokenUrl)
				.send({ client_id: clientID, client_secret: clientSecret })
				.end(function(res) {
					if (res) {
						xappToken = res.body.token; 
					} else {
						sails.log.error('api/services/Artsy.js:');
						sails.log.error(res.text);
					}
				});

		} catch(e) {

			sails.log.error('api/services/Artsy.js:');
			sails.log.error(e);

		}
	},

	getArtistStatement: function(){
		
		var api = traverson.jsonHal.from(sails.config.artsy.apiUrl);

		var request = api.newRequest()
			.follow('artist')
			.withRequestOptions({
				headers: {
					'X-Xapp-Token': xappToken,
					'Accept': 'application/vnd.artsy-v2+json'
				}
			})
			.withTemplateParameters({ id: 'andy-warhol' })
			.getResource(function(error, andyWarhol) {
				console.log(andyWarhol.name + 'was born in ' + andyWarhol.birthday + ' in ' + andyWarhol.hometown);
			});
	}

};

/config/artsy.js

/**
* artsy.js
*
* @description :: This is the brains that allow the app to connect to artsy.
* @docs        :: http://sailsjs.org/#!documentation/models
*/
module.exports.artsy = {
  clientId: 'CLIENT_ID',
  clientSecret: 'CLIENT_SECRET',
  apiUrl: 'https://api.artsy.net/api',
  apiTokenUrl: 'https://api.artsy.net/api/tokens/xapp_token'
};

【问题讨论】:

  • 在 Angular 中,我们在登录/验证时将 Token 设置为 rootScope/Global Var,然后创建一个在每个 API 请求的标头中发送它的服务。可能不相关,但我想我会分享。您还可以将令牌存储在 localStorage 中,并在需要时调用它。
  • 您能否详细说明“在登录/身份验证时将 Token 设置为 rootScope/Global Var”?有一个例子可以说明这一点吗?我相信我明白你在说什么,我只是希望看到它被应用。
  • 这是一个例子。登录成功后,关闭Session.create( data ) 并传入返回的用户对象。这是在本地存储中设置用户对象并提供一些参数的会话服务。 pastebin.com/NvHNwedp 在您的 API 请求中使用 $http 或其他方式,您可以使用 headers = { "AUTHORIZATION": "Token " + Session.get.authToken() }; 传入 authToken

标签: javascript node.js api sails.js sails.io.js


【解决方案1】:

如果我正确理解您的问题,那么

这是一个问题。如果不是,那么在 SailsJS 中设置对 API 的基本调用的正确方法是什么?

服务非常适合这种情况。 您可以在 config/bootstrap.js 中调用您的 init 方法,或者在用户登录或其他地方时调用。

我需要等到令牌被检索到之后才能调用需要它的 API 方法。这是通过 pubsub 完成的吗

是的,您可以使用 pubsub,但使用 Promise 似乎更好。例如你可以使用这个库 https://github.com/istavros/vowjs

你可以在视图中使用服务调用吗?如何?这甚至有意义吗?看起来它可能对 API 调用有用。

我想是的,但似乎你不应该想要它。当模板与控制器传递的数据一起工作时,它看起来很不错。因此,在控制器(或 mb 模型)中使用服务,然后将结果传递给模板。

【讨论】:

  • 感谢您的回复。我相信你可能是对的,承诺似乎是要走的路。我一直在四处寻找,似乎Bluebird 已经引起了 SailsJS 社区的注意。所以我想我会从那里开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2015-05-23
相关资源
最近更新 更多