2016 年 5 月

第 31 卷,第 5 期

本文章是由機器翻譯。

工作的程式師如何成為平均: 取得 Edge(.js)

Ted Neward | 5 月 2016

Ted Neward歡迎回來,「 MEANers 」。 在前幾期,我加入結構的位元加上我緩時變已建置的軟體堆疊 MongooseJS 程式庫是 JavaScript、 節點和 MongoDB,否則 structureless 環境。這會使某些 「 結構描述 」 各地不同的集合節點/Express 中介軟體已接收並儲存,這很好的因為它可協助防止某些一般人啟發錯誤 (例如搜尋 「 fristName 」,而不是實際的欄位 「 firstName 」)。最棒的 MongooseJS 是整個程式碼端,這表示,實際上,您現在有集合兩者之優點,至少到目前為止在資料庫而言,「 結構 」 中的資料庫 (更輕鬆地重構) 和 「 schemaful 」 (讓它成為不太可能打錯字會把事情搞亂) 程式碼中。

但是,如果我可以使用個人一下這裡,我必須承認漏接 Microsoft.NET Framework。或者,若要更明確,我遺漏一些很酷的事情.NET 生態系統已經其內可用。特別是,當我執行在 Microsoft Azure 雲端,其中許多組織會有一些小 (或非常大) 的投資在.NET 「 堆疊 」,似乎有點不適當來討論關於 JavaScript 中,如果要將所有的.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 # 中撰寫 — 是特定。網路類型簽章 ︰ 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-儲存邊緣的 「 安裝 」,如此它在認可至 Azure 時 package.json 資訊清單中追蹤。接下來,我 app.js 的程式碼,加入"helloWorld"函式和設定快速端點,讓我可以 「 取得 」 上並取得該透過 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

定期發生每當我討論平均值的一個問題是有關 MongoDB 的堆疊與.NET 開發人員。不少人不喜歡放棄其 SQL Server,尤其是在 Azure 上執行的概念。當然,Node.js 社群已建立數個關聯式資料庫存取 Api 和 SQL Server 剛才離開的任何 TDS 連接但 Edge.js 實際上有該特定的問題很有趣的解決方案 (一次您"npm install-儲存邊緣 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 執行個體,也許是使用 SQL Server 的無結構描述的 JSON ish 資料、 儲存嚴格 schemaed 關聯式資料和 MongoDB 的 「 polypraeclusio 」 (「 多個儲存體 」) 方法的組件實際上很簡潔。

為什麼,一次?

鑑於大部分的開發人員通常查看 askance 任何解決方案需要在相同的時間可以加以 conversant 多種語言,則它可能是值得深入探究有點到當和這個使用方式。

答案顯然是針對大多數 greenfield 種類的專案,與所需,沒有舊版程式碼支援是一般的規則會維持一個語言/平台或其他內部的完全 ︰ 可能是堅持使用.NET 和等等,使用 Web API 或進入 「 整個 hog 」 Node.js,而依賴各種程式庫和找該處完成目標的封裝。畢竟,為任何您可以將執行在.NET 裡,有可能對等的封裝中沒有 npm 封裝儲存機制。不過,這種方法也有一些警告。

首先,.NET 生態系統的優點有已有許多再且,因此,有些封裝有更實際派上用場且值得信賴。許多 npm 封裝仍然調戲與高奇怪的版本號碼;管理員很難版本編號從 0 開始,例如信任的任何項目。

第二,某些問題,最好的某些程式設計方法或環境。現成的例子,F # 語言經常 「 更具意義 」 為數學背景具有更輕鬆有時讓他們撰寫特定種類的程式碼。這是數列的在幾年前當我撰寫 Feliza 程式庫 (一部分示範如何使用 SMS 使用 Tropo 定域機組定域機組中)。雖然它可能已撰寫 C# 中,F # 的模式比對,以及 「 使用中模式 」 變更較容易撰寫比有我執行它以 C#。這也適用於 JavaScript (或許是更是如此)。

最後,也可能是最重要的是,是,有時候的環境中執行程式碼本質上只支援一個平台的原因。比方說,裝載在 Azure 中的應用程式的許多組織會使用 Active Directory 作為其驗證與授權基底。如此一來,他們要繼續使用 Active Directory 的任何新的應用程式,以.NET 或 Node.js 撰寫。存取 Active Directory 通常是更簡單且更輕鬆,若要這麼做比任何其他東西.NET 環境從 Edge.js 程式庫提供方便 [設陷媒體櫃門,] 就是所謂,以便更容易存取 Active Directory。

總結

已經有點輕這一版中,這多半是因為 Edge.js 程式庫會這麼 interoperably 使用.NET 環境的工作。它會開啟新的 Azure 更出色,選項的因為您現在可以存取但兩個內容豐富且完整的生態系統的工具、 程式庫和套件的不只一個。

請注意,等候整個資料行是撰寫將其他方向,順便一提 ︰ 在許多情況下,某些種類的應用程式是較容易撰寫 npm 儲存機制中使用不同的套件,Edge.js 現在會開啟傳統的.NET 開發人員。與新的開放原始碼版本的 Chakra — 可以 「 插入 」 以在節點與環境掉落隨插即用中的 Microsoft JavaScript 核心 — 這樣會增加更多的機會使用 JavaScript 做為 「 標準 」.NET 應用程式,包括甚至能夠裝載您的應用程式中心 JavaScript 直譯器。當您停止考慮一下,這會有自己有趣的意涵。

我想要完整地移出伺服器之前所討論的幾個動作,但我的空間,因此現在...祝各位寫程式 !


Ted Neward是西雅圖 polytechnology 顧問、 講師及指導。他曾經撰寫超過 100 個文件,是 F # MVP、 INETA 主講人,並具有作者及合著者著作。與他連絡 ted@tedneward.com 如果您想要讓他來自與您的小組,或是閱讀他的部落格 blogs.tedneward.com

感謝以下技術專家對本文的審閱: Shawn Wildermuth