2016 年 5 月

第 31 卷,第 5 期

此文章由机器翻译。

工作的程序员如何成为平均: 使用 Edge(.js)

通过 Ted Neward | 2016 年 5 月

Ted Neward欢迎回来,"MEANers。" 在上一期中,我向 MongooseJS 库添加到我慢慢地构建了一种软件堆栈是 JavaScript、 节点和 MongoDB,否则为 structureless 环境添加结构的位。这会导致某些"架构"周围的不同集合节点/Express 中间件是接收和存储,这很好的因为它有助于避免某些常见人类极具创意错误 (如搜索"fristName"而不是实际的字段"firstName")。最重要的是,MongooseJS 是完全代码方面,这意味着所有实用的角度而言,那么现在这两个领域的最佳产品至少在数据库而言,"无模式"中的数据库 (使其成为得更容易重构) 和"schemaful"在代码中 (使其成为情况极少,拼写错误就会变得一团糟事情)。

但是,如果我在此处可以个人稍后,我必须承认我错过 Microsoft.NET Framework。或者,若要更具体,我错过一些很酷的事情.NET 生态系统可以在其中使用。尤其是,当我正在执行其中很多组织都将不得不小 (或非常大) 的某些投资.NET"堆栈"中似乎有点不住脚谈论过多担心会 JavaScript 中,如果所有在 Microsoft Azure 云上的.NET 资料保持外出时的访问。或者,至少,无法执行某种类型的远距离 HTTP 样式请求除外的访问,这似乎有点无聊在同一个数据中心内工作时。

幸运的是,我们有一条边。或者,若要进行更具体 Edge.js。

Edge.js

Edge.js 项目是认真的 a-独一无二在很多方面,最值得注意的是,它旨在非常直接的"平台差距".NET 和 Node.js。在托管 bit.ly/1W7xJmo, ,Edge.js 故意设法使每个平台中非常代码友好的方式的其他可用到每个。

例如,获取要调用.NET 函数如下所示的 Node.js 代码示例 ︰

var edge = require('edge');
var helloWorld = edge.func(function () {/*
  async (input) => {
    return ".NET Welcomes " + input.ToString();
  }
*/});
helloWorld('JavaScript', function (error, result) {
  if (error) throw error;
  console.log(result);
});

如您所见,以编程方式,这并不难 ︰ 将函数文本传递给 edge.func 方法,该文本的函数内包含的.NET 代码以调用作为注释的正文。

是,亲爱的读者,一条注释。当您意识到,这不是那么奇怪 ︰

  • 它不能为文本的 C# 语法或节点解释器不会将它识别为合法程序语法 (因为,别忘了,节点解释器是一种 JavaScript 解释程序,不一 C# 解释程序)。
  • 与不同的是已编译的程序,该解释器有权访问任何源代码,而不是刚刚什么编译器选择发出定义的完整主体。

请注意,这并不限于只是 C# 中,顺便说一下;Edge.js 项目列出可以用作"目标"的边缘呼叫时,其中包括 F #、 Windows PowerShell、 Python 或甚至 Lisp、 使用的每个这些语言的.NET 实现的几种其他语言。当然,我最喜欢是 F #:

var edge = require('edge');
var helloFs = edge.func('fs', function () {/*
  fun input -> async {
    return "F# welcomes " + input.ToString()
  }
*/});
helloFs('Node.js', function (error, result) {
  if (error) throw error;
  console.log(result);
});

请注意的关键区别是文本的函数的前面是怎样被遗漏的参数,指示哪些语言传递的是该函数的注释中。

这里的关键是要认识到,函数的主体 — 是否用 C# 或 F # 中编写 — 是特定。NET 类型签名 ︰ Func < 对象 < 对象 >> 任务。是必需的异步此处因为记住节点倾向于以避免阻塞主 Node.js 事件循环将按顺序执行的回调。

Edge.js 也变得相对简单调用这些函数在编译的.NET Dll 上。因此,例如,如果您有想要调用的.NET 代码的已编译程序的集,Edge.js 可以调用该处理程序,但前提是作为"func"调用的一部分提供的程序集名称、 类型名称和方法名称 ︰

var helloDll = edge.func({
  assemblyFile: "Echo.dll",
  typeName: "Example.Greetings",
  methodName: "Greet"
});

Greet 的类型签名是否 Func < 对象 < 对象 >> 任务,如中所示 图 1, ,Node.js 可以调用它的其他示例所示,使用相同的调用模式 (在输入的参数和回调函数中传递),则。

图 1 Edge.js 兼容.NET 终结点

using System;
using System.Threading.Tasks;
namespace Example
{
  public class Greetings
  {
    public async Task<object> Greet(object input)
    {
      string message = (string)input;
      return String.Format("On {0}, you said {1}",
        System.DateTime.Now,
        Message);
    }
  }
}

还有可能要转到另一种方法 — 排列.NET 代码,以调入 Node.js 程序包,但由于这里的目标是在服务器端上运行 Node.js,因此我要将此当作练习感兴趣的读者。(顺便说一下,所有 Edge.js 内容要都容易得多从 Windows 计算机比 Mac 使用; 尝试以使其在本专栏写作期间处理我的 Mac 的无疑是很费时间,考虑各种因素,因此,这都是一种情况下,Windows 体验肯定胜过 Node.js 相关开发的 Mac。)

我想要为此功能快速 hello world 样式数值调节钮之前执行任何操作更复杂的。

大家好边缘

要事第一次,同样,所有这些都需要 (因为这是我选择的目标部署环境),在 Microsoft Azure 中工作,因此,请确保"npm install-保存边缘"到,以便将跟踪在 package.json 清单中时获取提交到 Azure。接下来,我将"helloWorld"函数添加到 app.js 代码中,并设置快速终结点,以便我可以"GET"在其上,获取之内通过 HTTP,该问候语中所示 图 2。而且,果然,将 GET 发送到 msdn-mean.azurewebsites.net/edgehello 使返回 ︰

{"message":".NET Welcomes Node, JavaScript, and Express"}

图 2 添加"helloWorld"函数

var helloWorld = edge.func(function () {/*
    async (input) => {
        return ".NET Welcomes " + input.ToString();
    }
*/});
var edgehello = function(req, res) {
  helloWorld('Node, JavaScript, and Express', function (err, result) {
    if (err) res.status(500).jsonp(err);
    else res.status(200).jsonp( { message: result } );
  });
};
// ...
app.get('/edgehello', edgehello);

大家好,SQL Server

每当我谈到平均值时定期出现的一个问题与.NET 开发人员的堆栈是有关 mongodb 的更多信息。很多人不喜欢的放弃它们的 SQL Server,尤其是在 Azure 上运行时的想法。当然,Node.js 社区已经构建了几个关系数据库访问 Api 和 SQL Server 将只远离其中任何一,创建 TDS 连接但 Edge.js 实际上有一个非常有趣的解决方案,对该特定问题 (一次您"npm 安装--边缘 sql 保存"以提取边缘 SQL 包):

var edge = require('edge');
var getTop10Products = edge.func('sql', function () {/*
  select top 10 * from Products
*/});
getTop10Products(null, function (error, result) {
  if (error) throw error;
  console.log(result);
  console.log(result[0].ProductName);
  console.log(result[1].ReorderLevel);
});

此代码假定 Azure 环境具有名 EDGE_SQL_CONNECTION_STRING 设置为适当的 SQL Server 连接字符串 (其中,在这种情况下,可能会指向于在 Azure 中运行的 SQL Server 实例) 的环境变量。

这就是比使用几乎任何事项我所见,坦白地讲无疑是更简单。它可能不会替换 Entity Framework 很快,当然,但对于快速访问的 SQL Server 实例,可能属于"polypraeclusio"("多个存储") 采用的方法,SQL Server 来存储严格以关系数据和 MongoDB 对于无模式的 JSON 风格数据,它实际上非常简洁。

嗯,再次?

考虑到大多数开发人员通常看 askance 任何解决方案时根据需要在同一时间为 conversant 以多种语言,可能是值得深入深入到何时和如何使用此。

明显的答案是,对于必需的没有旧代码支持大多数 greenfield 类型的项目中,通常会停留在一个语言/平台或另一个内完全 ︰ 坚持使用.NET 和在其他方面,使用 Web API,或"整个 hog"转到 Node.js,并且在各种库和包找到实现目标手头那里依赖。毕竟,对于几乎可以认为.NET 环境中执行的没有可能等效包 npm 包存储库中。但是,这种方法是附带几个需要注意的问题。

首先,.NET 生态系统的优点至今已有解决大量再和,因此,有的软件包的原因包括 ︰ 多六大和信赖度。许多 npm 程序包仍 flirting 具有高度可疑版本号;管理员可以信任的任何版本数量起始值为 0,例如一段时间。

第二,某些问题适合于特定编程方法或环境;相关案例,F # 语言经常"更有意义"供具有数学背景并使其有时会导致他们更容易编写某些种类的代码。这种情况是少数几年前我在编写 Feliza 库 (作为演示如何使用 Tropo 云在云中使用 SMS 系列的一部分);尽管可能已在 C# 编写,F # 的模式匹配和"活动模式"进行更易于编写上比以前我已做过 C# 中。这同样适用于 JavaScript (可能是更)。

最后,或可能的最重要的是,是,有时在其中执行代码只是自然倾向于一个平台通过另一个环境。例如,宿主应用程序在 Azure 中的许多组织使用 Active Directory 作为其身份验证和授权基;因此,他们会想要继续使用任何新编写的应用程序,无论是在.NET 还是 Node.js 的 Active Directory。访问 Active Directory 是通常更简单和轻松 Edge.js 库提供方便"陷阱门,"众人皆知了这样做比任何其他操作在.NET 环境中,以使其更易于访问 Active Directory。

总结

已经过了一些较浅这次,这主要是因为 Edge.js 库充分如此多的 interoperably 使用.NET 环境外的工作。并且由于现在您有权但两个丰富的、 完整的生态系统的工具、 库和包的不只是一个打开了一整套用于 Azure 强大的新选项。

请注意,没有等待进行一整列编写将另一个方向,太,顺便提一下 ︰ 在许多情况下,某些种类的应用程序变得更容易编写,Edge.js 现在打开时显示传统的.NET 开发人员在 npm 存储库中,使用各种可用的包。和利用最新的开放源代码版本的 Chakra — 可以"插入"到作为顺便即插即用节点环境的 Microsoft JavaScript 核心 — 这会打开更多的机会将 JavaScript 用作"standard"的.NET 应用程序,包括甚至机会承载在您的应用程序中心 JavaScript 解释程序的一部分。当您停止有助于理解这一点时,这具有其自己感兴趣的意义。

有几个问题,我想讨论一下之前关闭服务器,但我外出时的空间,所以现在为 … 祝您编码愉快 !


Ted Neward是基于西雅图的 polytechnology 顾问、 发言人和导师。他曾写过 100 多篇文章,是一个 F # MVP、 INETA 讲师和具有创作,并且与人合著过十几本书。如果您有兴趣请他参与您的团队工作,请通过 ted@tedneward.com 与他联系,或通过 blogs.tedneward.com 访问其博客。

感谢以下技术专家对本文的审阅: Shawn Wildermuth