小编Chr*_*ill的帖子

用于构建单页面应用程序的JavaScript框架

我的目标是将现有Web应用程序迁移到RESTful 单页面应用程序(SPA).目前,我正在评估几个Javascript Web应用程序框架.


我的要求如下:

  • RESTful数据层(如ember-data)
  • MV* - 结构
  • 动态路线
  • 测试支持
  • 按惯例编码
  • SEO支持
  • 浏览器的历史记录,支持
  • 好的(API-)文档
  • 生产就绪
  • 生活社区

骨干

当前的应用程序正在使用backbone.js.总的来说,这backbone.js是一个很好的项目,但是我缺少明确定义的结构,这些结构决定了必须发生的事情以及必须如何实现.在更大的团队中工作,改变开发人员会导致某种非结构化代码,难以维护和难以理解.这就是为什么我现在正在寻找一个已经定义了所有这些东西的框架.

我调查ember.js了最后几天.这种方法对我来说似乎很有希望.但不幸的是,代码几乎每天都在变化.所以,我不会称之为生产就绪.而且,不幸的是,我们不能等待它成为1.0版本.但我真的很喜欢这个框架背后的想法.

Angular.js是一个广泛传播的框架,由谷歌维护.但我无法熟悉角度.对我来说,结构似乎有点不清楚,对框架的每个部分的总体职责缺失了解释,并且实现感觉迂回.只是为了说明这一点:这只是我的个人印象,可能是基于缺少的知识.

蝙蝠侠流星

据我所知,两个框架也需要一个服务器部分.因为我们只想要一个RESTful后端 - 无论使用什么语言,技术或软件,这都不是我们想要的.此外,后端API已经存在(RoR).

Knockout,CanJSSpine

我没有深入研究这三位候选人.也许这将是我的下一步.


所以现在我的问题是:

  • 我错过了任何优秀的SPA框架吗?
  • 你会建议/推荐什么框架?
  • 你会避免任何提到的框架吗?
  • 您在大型SP应用程序中的经验是什么?

PS:我想推荐一个伟大的博文由史蒂芬·安德森(从Knockout.js核心开发人员)约(自2012年)的"JS王座" -会议和一般的JavaScript框架.

PS:是的,我知道已经有一些问题了.但是,由于SPA的发展如此迅速和快速,因此大多数已经过时了.

javascript singlepage

101
推荐指数
2
解决办法
8万
查看次数

如何模块化AngularJS应用程序/插件

关于从Grails(REST-API,AngularJS,MongoDB,Tomcat,Spock,几个插件的部分)到Node.js + Angular.js的迁移,我有几个(软件)架构问题.我可能要解释Grails项目拳头的结构,所以我们在这里:

有一个主要的Grails应用程序(旁边的几个其他应用程序),它建立在几个插件上.这些插件中的每一个都能够自行执行 - 这意味着它有自己的UI,单独的模板,服务,控制器,路由,测试等.它也托管在不同的存储库中.这是由Grails插件机制完成的.其好处是减少了测试工作量,减少了编译时间,模块化,单一职责等等.

但是,编译和测试的时间太贵了.此外,我不喜欢API提供部分模板/视图的事实.我想让后端API"只是作为后端API"和前端"只是作为前端".因此,每个AngularJS应用程序/插件都将提供自己的视图,路由,服务等.但它们也可能依赖于其他插件.

所以我想要实现的目标如下:

  • 一个主要的AngularJS应用程序,包括几个插件(一个插件可以是类似报表生成器,留言簿或任何东西,说到应用程序的单个独立部分,具有特定路径,或只是页面的一小部分) ).
  • 每个插件必须是一个独立的AngularJS应用程序(可能在开发期间通过grunt等执行).因此,UI开发人员不需要启动整个后端应用程序,因此我们可以仅使用JavaScript运行功能测试
  • 仅通过REST进行通信,前端必须从API检索所有数据
  • 每个插件必须可以单独测试
  • 插件可能需要其他插件才能工作
  • 主要的index.html(和app.js?)可能由Nginx服务器提供,该服务器与后端的其余部分(API)分离

虽然我脑子里有一张特定的图片,但我正在努力设置这个架构.

在Grails中,插件机制以某种方式将插件依赖设置(如URL映射,依赖关系等)合并到包含/注入它们的主应用程序中 - 这也是我想用AngularJS实现的.所以:

  • AngularJS是否有某种相同的机制?
  • 如何将每个插件的路由提供/合并到主应用程序中?
  • 如何声明应用程序和插件依赖项?
  • 哪些工具可能对构建过程有用?
  • 如何建立插件资源(css/less文件,视图,服务等)的延迟检索?
  • 阻止应用程序在启动时提供插件的所有资源(我想在启动时需要路由)

因为这不仅仅是一个怎么做这个或那个问题,如果我错过了重要的部分,或者某些部分不够清楚,我会原谅自己.请问我,我将深入回答每个问题.

grails modularization node.js angularjs single-page-application

16
推荐指数
1
解决办法
2303
查看次数

何时拒绝/解决承诺

我正在考虑何时需要拒绝承诺.我发现了一些关于这个主题的问题,但找不到合适的答案. 我何时应该拒绝承诺?

这篇文章 http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises 说:

  • 解决:成功的Promise'已解决',它会调用正在等待的成功侦听器并记住为附加的未来成功侦听器解析的值.分辨率与返回值相关.
  • 拒绝:遇到错误条件时,Promise被"拒绝",它会调用正在等待的错误侦听器,并记住为附加的未来错误侦听器拒绝的值.拒绝与抛出的异常相关.

这是主要原则吗?如果发生异常,那个人只会拒绝承诺吗?

但是在像这样的功能的情况下

findUserByEmail()
Run Code Online (Sandbox Code Playgroud)

我希望该函数返回一个用户,这样我就可以在不验证结果的情况下继续链接

findUserByEmail()
    .then(sendWelcomeBackEmail)
    .then(doSomeNiceStuff)
    .then(etc..)
Run Code Online (Sandbox Code Playgroud)

什么是最佳/常见做法?

node.js promise q

15
推荐指数
2
解决办法
1万
查看次数

自定义错误和蓝鸟捕获ErrorClass会导致无意中的行为

我正在尝试为自定义错误实现一个模块.

应该可以使用此模块在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)

javascript error-handling prototype node.js bluebird

8
推荐指数
1
解决办法
718
查看次数

在 Flask 单元 pytest 中模拟 current_app

我想对以下功能进行单元测试:

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 上下文。我想要一个简单的单元测试,其中所有协作者都可以被模拟,以便被测系统只处理模拟实例,在本例中 …

unit-testing mocking pytest flask

7
推荐指数
1
解决办法
6638
查看次数

Mongoose模型方案在单独的模块中

免责声明:我是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测试. …

model mongoose mongodb node.js

6
推荐指数
1
解决办法
1426
查看次数

Datadog:通知每个新日志项的错误级别

是否可以配置 datadog 来通知记录的每个新错误?

我知道如何设置指定时间段的阈值以及如何将错误计数发送到松弛状态。但我正在寻找发送实际错误而不是错误数量的可能性。

datadog

6
推荐指数
1
解决办法
1529
查看次数

从服务器端检查谷歌Android订阅

简而言之:我可以在服务器端使用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我想这是必要的,尽管我发现很多例子没有提供这些信息.

但是,遗憾的是,当我提供无效数据(如错误的电子邮件或私钥)时,我看不出任何差异.

问题

  • 如何验证GoogleCredential是否正确?
  • 我可以在接下来的步骤中看到它,比如联系ie androidpublisher API吗?

在下一步中,我尝试获取订阅的购买状态:

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-方法的参数中插入什么. …

api android subscription in-app-billing

5
推荐指数
1
解决办法
5061
查看次数

www.googleapis.com/androidpublisher/v1/上的GET 500内部服务器错误

最后,我可以解决我最近处理用于访问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

  • APP_PACKAGE 我上传到开发者控制台的应用程序的包名称
  • SUBSCRIPTION_ID为应用程序指定的订阅ID(开发人员控制台)
  • PURCHASE_TOKEN (虚拟)购买令牌
  • AUTH_TOKEN 从OAuth2检索的身份验证令牌.

我检索此请求的身份验证令牌如下:

// 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错误 - …

api android subscription

5
推荐指数
0
解决办法
2067
查看次数

Ember.js - 做得对(结构,包括,一般问题)

我正在玩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)

requirejs handlebars.js ember.js

5
推荐指数
1
解决办法
3510
查看次数

JSON.stringify使用嵌套对象进行白名单

给出以下示例:

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对象,因此嵌套对象的键与它的"父"对象相同.我想更明确地指定我的白名单.

javascript json whitelist

5
推荐指数
1
解决办法
2723
查看次数

IDEA 插件:PersistentStateComponent 不持久化 xml

我无法让我的插件保持其状态。文件 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)

java xml intellij-idea intellij-plugin

2
推荐指数
1
解决办法
1359
查看次数