我的目标是将现有Web应用程序迁移到RESTful 单页面应用程序(SPA).目前,我正在评估几个Javascript Web应用程序框架.
我的要求如下:
当前的应用程序正在使用backbone.js.总的来说,这backbone.js是一个很好的项目,但是我缺少明确定义的结构,这些结构决定了必须发生的事情以及必须如何实现.在更大的团队中工作,改变开发人员会导致某种非结构化代码,难以维护和难以理解.这就是为什么我现在正在寻找一个已经定义了所有这些东西的框架.
我调查ember.js了最后几天.这种方法对我来说似乎很有希望.但不幸的是,代码几乎每天都在变化.所以,我不会称之为生产就绪.而且,不幸的是,我们不能等待它成为1.0版本.但我真的很喜欢这个框架背后的想法.
Angular.js是一个广泛传播的框架,由谷歌维护.但我无法熟悉角度.对我来说,结构似乎有点不清楚,对框架的每个部分的总体职责缺失了解释,并且实现感觉迂回.只是为了说明这一点:这只是我的个人印象,可能是基于缺少的知识.
据我所知,两个框架也需要一个服务器部分.因为我们只想要一个RESTful后端 - 无论使用什么语言,技术或软件,这都不是我们想要的.此外,后端API已经存在(RoR).
我没有深入研究这三位候选人.也许这将是我的下一步.
所以现在我的问题是:
PS:我想推荐一个伟大的博文由史蒂芬·安德森(从Knockout.js核心开发人员)约(自2012年)的"JS王座" -会议和一般的JavaScript框架.
PS:是的,我知道已经有一些问题了.但是,由于SPA的发展如此迅速和快速,因此大多数已经过时了.
关于从Grails(REST-API,AngularJS,MongoDB,Tomcat,Spock,几个插件的部分)到Node.js + Angular.js的迁移,我有几个(软件)架构问题.我可能要解释Grails项目拳头的结构,所以我们在这里:
有一个主要的Grails应用程序(旁边的几个其他应用程序),它建立在几个插件上.这些插件中的每一个都能够自行执行 - 这意味着它有自己的UI,单独的模板,服务,控制器,路由,测试等.它也托管在不同的存储库中.这是由Grails插件机制完成的.其好处是减少了测试工作量,减少了编译时间,模块化,单一职责等等.
但是,编译和测试的时间太贵了.此外,我不喜欢API提供部分模板/视图的事实.我想让后端API"只是作为后端API"和前端"只是作为前端".因此,每个AngularJS应用程序/插件都将提供自己的视图,路由,服务等.但它们也可能依赖于其他插件.
所以我想要实现的目标如下:
虽然我脑子里有一张特定的图片,但我正在努力设置这个架构.
在Grails中,插件机制以某种方式将插件依赖设置(如URL映射,依赖关系等)合并到包含/注入它们的主应用程序中 - 这也是我想用AngularJS实现的.所以:
因为这不仅仅是一个怎么做这个或那个问题,如果我错过了重要的部分,或者某些部分不够清楚,我会原谅自己.请问我,我将深入回答每个问题.
grails modularization node.js angularjs single-page-application
我正在考虑何时需要拒绝承诺.我发现了一些关于这个主题的问题,但找不到合适的答案. 我何时应该拒绝承诺?
这篇文章 http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises 说:
这是主要原则吗?如果发生异常,那个人只会拒绝承诺吗?
但是在像这样的功能的情况下
findUserByEmail()
Run Code Online (Sandbox Code Playgroud)
我希望该函数返回一个用户,这样我就可以在不验证结果的情况下继续链接
findUserByEmail()
.then(sendWelcomeBackEmail)
.then(doSomeNiceStuff)
.then(etc..)
Run Code Online (Sandbox Code Playgroud)
什么是最佳/常见做法?
我正在尝试为自定义错误实现一个模块.
应该可以使用此模块在app的require-statement中实例化单个错误:
var MyCustomError = require('custom-error')('MyCustomError');
Run Code Online (Sandbox Code Playgroud)
这是模块:
'use strict';
var _CACHE = {};
function initError(name) {
function CustomError(message) {
this.name = name;
this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
_CACHE[name] = CustomError;
}
function createCustomError(name) {
if (!_CACHE[name]) {
initError(name);
}
return _CACHE[name];
}
module.exports = createCustomError;
Run Code Online (Sandbox Code Playgroud)
到目前为止,上面的要求一线工作正在进行中.
现在,在我的服务中,我想明确地捕获这个错误:
var MyCustomError = require('custom-error')('MyCustomError')
// ...
return fooService.bar()
.catch(MyCustomError, function (error) {
logger.warn(error);
throw error;
})
Run Code Online (Sandbox Code Playgroud)
如果我在测试中通过抛出MyCustomError来拒绝fooService.bar的承诺,那么这很有用.
但是,这只能起作用,因为我的测试和服务使用了相同的MyCustomError 实例.
例如,如果我删除了我的自定义错误模块中的缓存机制,则不会再达到/执行catch,因为bluebird不理解这两个错误的类型相同:
function createCustomError(name) {
//if (!_CACHE[name]) …Run Code Online (Sandbox Code Playgroud) 我想对以下功能进行单元测试:
from flask import current_app
def fuu():
current_app.logger.info('hello world')
any = current_app.config['any']
Run Code Online (Sandbox Code Playgroud)
如果没有任何特殊的上下文处理,我会收到以下错误消息:
E This typically means that you attempted to use functionality that needed
E to interface with the current application object in some way. To solve
E this, set up an application context with app.app_context(). See the
E documentation for more information.
Run Code Online (Sandbox Code Playgroud)
在阅读了 Flask 上下文之后,我想出了一个可行的解决方案:
@classmethod
def setUpClass(cls):
app = app_factory.create_app()
ctx = app.app_context()
ctx.push()
cls.app = app
Run Code Online (Sandbox Code Playgroud)
但重点是我不想在UNIT 测试中处理任何 Flask 上下文。我想要一个简单的单元测试,其中所有协作者都可以被模拟,以便被测系统只处理模拟实例,在本例中 …
免责声明:我是mongoose/node的新手,所以如果我误解了一些基本的东西,请原谅.是的,我发现已经有一些关于这个主题的帖子,但无法根据我的需求进行调整.
我将主项目组织成多个独立的项目.一个分离是"app-core"项目,它将包含核心模型和模块,由彼此项目注入(app-core在每个项目的package.json文件中配置为依赖项).
app-core中的(简化)模型目前看起来像这样:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var IndustrySchema = new Schema({
name: {
type: String,
required: true
}
});
module.exports = mongoose.model('Industry', IndustrySchema);
Run Code Online (Sandbox Code Playgroud)
wep-app包括以下模型:
var Industry = require('app-core/models/Industry');
Run Code Online (Sandbox Code Playgroud)
并创建像这样的MongoDB连接:
var DB_URL = 'mongodb://localhost/hellowins';
var mongoose = require('mongoose');
var mongooseClient = mongoose.connect(DB_URL);
mongooseClient.connection.on('connected',function () {
console.log("MongoDB is connected");
});
Run Code Online (Sandbox Code Playgroud)
现在我遇到了问题,模型不会使用app-web项目中定义的mongo连接,而是会考虑在app-core中配置的连接.
由于封装和责任设计,我绝对不希望核心为每个可能的应用程序(可能包括核心应用程序)定义连接.所以我不知何故只需要在核心中指定方案.
我已经读过我不应该要求模型本身(/ app-core/models/Industry),而是使用mongoose模型代替
var Industry = mongoose.model("Industry");
Run Code Online (Sandbox Code Playgroud)
但后来我得到了错误
MissingSchemaError: Schema hasn't been registered for model "Test"
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,我应该手动注册模型,就像在第一个链接中提到的那样(在我发布的顶部).但不知怎的,我不喜欢这种方法,因为每次应用程序使用新模型时我都需要扩展它.
而且即使在核心应用程序中我也需要一个mongo连接 - 至少要运行mocha测试. …
是否可以配置 datadog 来通知记录的每个新错误?
我知道如何设置指定时间段的阈值以及如何将错误计数发送到松弛状态。但我正在寻找发送实际错误而不是错误数量的可能性。
简而言之:我可以在服务器端使用Google Play Android Developer API,而无需在Play商店中提供任何应用程序吗?
背景:我正在开发一个项目,为每月订阅提供应用程序.每个订阅的相应数据(购买令牌,日期等)存储在后端数据库中.现在我想创建一个循环遍历每个数据集的cronjob.对于每个订阅,如果订阅仍然有效,我想联系Google API以检索信息,并更新与响应状态相对应的数据库.
对于后端逻辑,我使用google-api-java-client库.
要取消或验证订阅,我需要先使用OAuth2对自己进行身份验证.去过也做过.
new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher") // $1
.setServiceAccountPrivateKeyFromP12File(new File(filePath))
.setClientSecrets(CLIENT_ID, CLIENT_SECRET) // $2
.build();
Run Code Online (Sandbox Code Playgroud)
1美元:我不知道给定的帐户范围是否有效.因为我只是在极少数示例中找到了这个值,但在本概述和谷歌操场中都没有
$ 2我想这是必要的,尽管我发现很多例子没有提供这些信息.
但是,遗憾的是,当我提供无效数据(如错误的电子邮件或私钥)时,我看不出任何差异.
问题
在下一步中,我尝试获取订阅的购买状态:
Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(GOOGLE_PRODUCT_NAME) // $1
.build();
Androidpublisher.Purchases purchases = publisher.purchases();
Androidpublisher.Purchases.Get get = purchases.get("android.test.purchased", "monthly001", "mytoken"); // $2
SubscriptionPurchase subscripcion = get.execute();
Run Code Online (Sandbox Code Playgroud)
$ 1:来自API控制台的虚拟产品名称- > API Access
$ 2:除了事实之外,androidpush API 不允许通过服务帐户联系它,但只能通过web服务器应用程序auth flow,我没有任何线索在get-方法的参数中插入什么. …
最后,我可以解决我最近处理用于访问google API的OAuth2身份验证的问题.
但现在我在查询android开发人员API以检索有关订阅的状态信息时遇到困难.我正在使用以下REST API调用:
https://www.googleapis.com/androidpublisher/v1/applications/ APP_PACKAGE/subscriptions/SUBSCRIPTION_ID/purchases/PURCHASE_TOKEN?access_token = AUTH_TOKEN
我检索此请求的身份验证令牌如下:
// Build the HTTP parameter
Map<String,String> params = [:]
params.put("grant_type", "refresh_token")
params.put("refresh_token", googleRefreshToken.encodeAsURL())
params.put("client_id", googleClientId.encodeAsURL())
params.put("client_secret", googleClientSecret.encodeAsURL())
// Send the POST request
// This action might throw an exception in case any parameter were wrong, invalid or not specified.
String result = HttpRequestHandler.sendRequest("https://accounts.google.com/o/oauth2/token", params);
JSONElement jsonResult = JSON.parse(result)
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但上面提到的REST调用返回500错误 - …
我正在玩ember.js并且卡在某种程度上找不到如何以正确的方式构建结构.我可以遵循所有的例子,但是把它们放在一起会有一些问题.
我正在使用require.js和把手.
我的目录结构如下所示:
- app
- - controllers
- - css
- - helpers
- - lib
- - models
- - routes
- - templates
- - - partials
- - views
Run Code Online (Sandbox Code Playgroud)
我的application.js看起来像这样:
require.config({
paths:{
jquery:'lib/jquery-1.7.2',
handlebars:'lib/handlebars',
ember:'lib/ember',
ember_data:'lib/ember-data',
text:'lib/requireJS/text',
md5:'lib/md5',
spin:'lib/spin'
},
shim:{
'ember':{
deps:[ 'jquery', 'handlebars'],
exports:'Ember'
},
'ember_data':{
deps:[ 'ember'],
exports:'DS'
}
},
waitSeconds:15
});
define('application'
,[
// Routes
'routes/app_router'
// Controller
,'controllers/application_controller'
// Views
,'views/application_view'
,'views/category/category_list_view'
// Libraries
,'jquery'
,'handlebars'
,'ember'
,'ember_data'
,'spin' …Run Code Online (Sandbox Code Playgroud) 给出以下示例:
var test = {
"company_name": "Foobar",
"example": "HelloWorld",
"address": {
"street": "My Street 12",
"example": "BarFoo",
"details": "Berlin",
}
}
console.log(JSON.stringify(test, ['company_name','address','street','example']));
// What I actually want
// console.log(JSON.stringify(test, ['company_name','address.street','address.example']));
Run Code Online (Sandbox Code Playgroud)
如何使用JSON的stringify函数正确处理嵌套对象?
由于我有巨大的JSON对象,因此嵌套对象的键与它的"父"对象相同.我想更明确地指定我的白名单.
我无法让我的插件保持其状态。文件 configProvider.xml 永远不会被创建,@State注释也没有任何效果(显然)。
这是 plugin.xml 中的相关部分
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="my.plugins.idea.vcs.ConfigProvider" serviceInterface="my.plugins.idea.vcs.ConfigProvider"/>
</extensions>
Run Code Online (Sandbox Code Playgroud)
这是提供应该持久化的对象的类:
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import java.util.LinkedHashMap;
@State(
name = "ConfigProvider",
storages = {
@Storage(id = "main", file = "$APP_CONFIG$/configProvider.xml")
}
)
public class ConfigProvider implements PersistentStateComponent<ConfigProvider.State> {
private State state = new State();
class State {
public State() {}
public LinkedHashMap<String, String> commitTypes = null;
public Integer selectedDefaultCommitTypeIndex = null;
public String jiraApiUrl;
public String jiraAuthorization;
public String jiraFilterId;
}
public …Run Code Online (Sandbox Code Playgroud)