NodeJS を初めて使用する人は、その API を習得するのが難しいと感じることがよくあります。幸いなことに、多くの開発者が Node.js の操作を容易にするフレームワークを作成しました。 Connect はそのようなフレームワークです。これは Node の API の上に位置し、快適さと制御の間に境界線を引きます。
Connect をミドルウェア スタックとして考えてください。リクエストごとに、Connect はミドルウェア層を通じてフィルタリングされ、各層が HTTP リクエストを処理する機会を取得します。 T.J. Holowaychuk 氏が Connect を発表したとき、ミドルウェアには 2 種類あると述べました。 1 つ目は フィルター です。
フィルターはリクエストを処理しますが、それに応答しません (サーバーのログを考えてください)。
もう 1 つのタイプは、リクエストに応答する プロバイダー です。ミドルウェアは必要なだけ組み合わせることができ、ミドルウェアの 1 つがリクエストに応答するまで、リクエストは各層を通過します。
基本文法
まず、npm 経由で Connect パッケージをインストールする必要があります:
リーリー次に、server.js
ファイルを作成し、次のコードを追加します。
リーリー
connect 変数は、新しい Connect アプリケーションを返す関数です。したがって、次のステップはアプリケーションを作成することです:
リーリー
app 変数を作成する必要はありません。アプリケーションの作成に関与する関数 (
connect() および
use()) はチェーン可能です:
リーリー
use() 関数はアプリケーションにミドルウェア層を追加し、
listen() 関数はアプリケーションに指定されたポート (この場合は 3000) の受け入れを開始するように指示します。接続オン。
リーリー
デフォルトでは、Node は受信リクエストをほとんど解析しません。このコードをファイルに追加し、
node server.js を実行してサーバーを起動します。ブラウザで任意のパスに移動し、「Unable to get...」という結果は無視してください。私たちはサーバーがブラウザに何を送り返すかには興味がなく、サーバーのログに興味があります。ターミナルを見ると、リクエストのログが表示されます。追加機能とカスタマイズについては、ロガーのドキュメントを必ず確認してください。
リーリー
Node の__dirname 変数の目的はおそらく推測できるでしょう。これは現在のディレクトリへのパスです。このミドルウェアは、現在のディレクトリの
public フォルダーにあるものすべてを静的に提供します。したがって、
public/page.html を作成し、
<h1 id="要素を追加します-サーバー"> 要素を追加します。サーバー (</h1>
node server.js) を再起動し、ブラウザで
localhost:3000/page.html に移動します。ブラウザで
page.html をレンダリングする必要があります。
リクエスト本文を解析する
デフォルトでは、Node は少数の受信リクエストを解析しますが、より複雑な状況を処理する必要がある場合は、複数の異なるフィルターを組み合わせてリクエストを解析できます。 4 つのフィルターがあります:
- connect.json()
JSON リクエスト本文を解析します (
content-typeは
application/jsonです)。
- connect.urlencoded()
リクエスト本文を解析します。
- connect.multipart()
リクエストの本文を解析します。
- connect.bodyParser()
は、上記の 3 つの機能をすべて有効にするショートカットです。
request.body 経由で解析された本文にアクセスできるようになります (
request オブジェクトの取得方法については後ほど説明します)。
Cookie とセッションの解析
Cookie とセッションは Web アプリケーションの重要な部分であり、それらの管理に役立つミドルウェアがいくつかあります。
connect.cookieParser() は Cookie を解析し、
request.cookies オブジェクトを通じて Cookie とその値を取得できます。
connect.session() フィルターをアプリケーションに追加すると、これはさらに便利になります。このフィルタには、Cookie パーサーが配置されている必要があります。以下に小さな例を示します:
リーリー
作成したすべてのミドルウェア関数は、リクエストをnext
層に渡すか、リクエストに応答する必要があります。
cookieParser の後に
session フィルターを組み込み、それに 2 つのオプションを渡します。
<ul>
<li>
<code>secret
创建一个签名 cookie,用于跟踪会话。
cookie.maxAge
定义其生命周期(以毫秒为单位);此代码中的 30000 是 30 秒。在最后的 use()
调用中,我们传递一个响应请求的函数。我们使用 request
对象中的两个属性:req.session
用于会话数据,req.url
用于请求 URL。
如果应用程序收到对 /name/some_name
的请求,则它将值 some_name
存储在 req.session.name
中。会话中存储的任何内容都可以在会话期间的后续请求中检索。对 /name/other
发出的任何请求都会替换会话变量,对其他 URL 的任何请求都会输出会话变量的值和会话剩余时间。
因此,您可以导航到 localhost:3000/name/your_name
,然后转到 localhost:3000
查看 your_name
。刷新页面几次并观察秒数倒计时。当会话过期时,您将看到默认的“未存储名称”消息。
我提到 cookieParser
过滤器必须位于 session
之前。
包含的顺序对于中间件很重要,因为请求是按顺序从一层传递到另一层的。
由于session
需要解析后的cookie数据,因此请求必须先经过cookieParser
,然后再经过session
。
我可以解释所有其他内置中间件,但在我们编写自己的代码与 Connect 交互之前,我只会再提一些。
- compress:Gzip压缩中间件
- basicAuth:基本http认证
- 目录:列出中间件的目录
- errorHandler:灵活的错误处理程序
编写自己的中间件
您刚刚学习了如何使用 Connect 编写自己的代码。这是基本语法:
.use(function (req, res, next) { })
函数的三个参数很重要;它们提供了通往外部世界的通道。 req
参数当然是请求对象,res
是响应。第三个参数 next
是使函数在中间件堆栈中正常运行的关键。它是一个将请求传递到堆栈中的下一个中间件的函数。请参阅此示例:
connect() .use(function (req, res, next) { if (req.method === 'POST') { res.end("This is a POST request"); } else { next(); } }) .use(function (req, res) { res.end("This is not a POST request (probably a GET request)"); }).listen(3000);
这段代码使用了两个中间件函数。第一个函数检查请求方法以查看是否是 POST 请求。如果是,它就会这样回应。否则,我们调用 next()
并将请求传递给下一个函数,该函数无论如何都会响应。使用 curl
在终端中测试两层:
$ curl http://localhost:3000 This is not a POST request (probably a GET request) $ curl -X POST http://localhost:3000 This is a POST request
如果您不喜欢该终端,请尝试这个有用的 Chrome 插件。
重要的是要记住,您编写的每个中间件函数都需要将请求传递到 next
层或响应请求。如果您的函数分支(通过 if 语句或其他条件),您必须确保每个分支都会传递请求或响应请求。如果您的应用程序在浏览器中挂起,可能是因为您忘记在某个时刻调用 next()
。
现在,那些 request
和 response
参数怎么样?这些与您在使用“原始”节点服务器时收到的请求和响应对象完全相同:
require("http").createServer(function (req, res) { // ... }).listen(3000);
如果您以前没有使用过 Node 的服务器 API,让我向您展示可以用它做什么。
请求对象
request
对象实际上是一个http.IncomingMessage
对象,其重要属性如下::
-
req.method
告诉您使用了哪种 HTTP 方法。 -
req.url
告诉您请求的是哪个 URL。 -
req.headers
是一个包含标头名称和值的对象。 -
req.query
是一个包含查询字符串中任何数据的对象(要解析它,您需要connect.query()
中间件)。 -
req.body
是表单数据的对象(您需要一些正文解析中间件)。 -
req.cookies
是cookie数据的对象(需要cookie解析)。 -
req.session
是会话数据的对象(同样,您需要 cookie 解析和会话中间件)
您可以使用以下代码查看所有这些工作:
connect() .use(connect.query()) // gives us req.query .use(connect.bodyParser()) // gives us req.body .use(connect.cookieParser()) // for session .use(connect.session({ secret: "asdf" })) // gives us req.session .use(function (req, res) { res.write("req.url: " + req.url + "\n\n"); res.write("req.method: " + req.method + "\n\n"); res.write("req.headers: " + JSON.stringify(req.headers) + "\n\n"); res.write("req.query: " + JSON.stringify(req.query) + "\n\n"); res.write("req.body: " + JSON.stringify(req.body) + "\n\n"); res.write("req.cookies: " + JSON.stringify(req.cookies) + "\n\n"); res.write("req.session: " + JSON.stringify(req.session)); res.end(); }).listen(3000);
要查看其中每个值的某些内容,您需要使用查询字符串将一些数据发布到 URL。以下内容应该足够了:
curl -X POST -d "name=YourName" "http://localhost:3000/some/url?some=data"
通过这七个属性,您几乎可以管理收到的任何请求。我不认为经常使用预告片(根据我的经验,我从未见过它们),但是如果您希望在请求中使用预告片,则可以使用 req.trailers
(预告片就像标头一样,但位于正文之后)。
那么,你的回应呢?
响应对象
原始响应对象不提供库(如 Express)为您提供的便利。例如,您无法通过对预制模板的简单渲染调用来响应 - 至少默认情况下不能。响应中的假设很少,因此您需要填写所有小细节。
我们将从状态代码和响应标头开始。您可以使用 writeHead()
方法一次性设置所有这些。以下是 Node 文档中的示例:
var body = 'hello world'; response.writeHead(200, { 'Content-Length': body.length, 'Content-Type': 'text/plain' });
如果需要单独设置header,可以使用setHeader()
方法:
connect() .use(function (req, res) { var accept = req.headers.accept.split(","), body, type; console.log(accept); if (accept.indexOf("application/json") > -1) { type = "application/json"; body = JSON.stringify({ message: "hello" }); } else if (accept.indexOf("text/html") > -1) { type = "text/html"; body = "<h1 id="Hello"> Hello! </h1>"; } else { type = "text/plain"; body = "hello!"; } res.statusCode = 200; res.setHeader("Content-Type", type); res.end(body); }).listen(3000);
将此代码添加到文件中,启动服务器并从浏览器请求它。你有 HTML!现在运行:
curl http://localhost:3000
您将收到纯文本。对于 JSON,请尝试以下操作:
curl -H "accept:application/json" http://localhost:3000
全部来自同一个 URL!
如果您需要知道已经设置了哪些标头,请使用 res.getHeader(name)
。您还可以使用 res.removeHeader(name)
删除标头。
当然,没有正文的响应是没有用的。正如您在本教程中所看到的,您可以使用 res.write()
方法将数据块写入正文。它接受字符串或缓冲区对象作为参数。如果是字符串,第二个参数是编码类型(默认为utf8
)。
res.end()
方法关闭主体,但您可以向其传递数据以写入响应流。这在您只需要输出一行的情况下非常有用。
第三方中间件
在普通的旧 Node 和 Connect 中响应较大的 HTML 主体有些困难。这是将第三方中间件加入其中的好地方。您可以在 Connect Github wiki 上找到第三方中间件的列表。例如,我们将使用 connect-jade 包,它允许我们渲染 jade 视图。
首先,安装connect-jade
:
npm install connect-jade
接下来,需要并将其添加为中间件。您需要设置一些默认值:
var connect = require("connect"), connectJade = require("connect-jade"); connect() .use(connectJade({ root: __dirname + "/views", defaults: { title: "MyApp" } })) .use(function (req, res) { res.render("index", { heading: "Welcome to My App" }); }).listen(3000);
将根目录设置为包含视图文件的目录。您还可以设置 defaults
;这些是每个视图中可用的变量,除非我们稍后在调用 render()
时覆盖它们。
此代码中的最后一个函数调用 res.render()
。该方法由 connect-jade
包提供。
它接受的第一个参数是要渲染的视图的名称。
它是视图的路径,无我们在添加中间件时定义的路径,无 jade 文件扩展名。对于这段代码,我们需要一个 views/index.jade
模板来渲染。我们会保持简单:
html head title= title body h1= heading
如果您不熟悉jade,我们会缩进标签名称来创建HTML 结构。等号检索 JavaScript 变量的值。这些变量来自我们设置的 defaults
,加上传递给 res.render()
的(可选)第二个参数对象。
还有许多其他第三方中间件,但它们的工作原理彼此相似。您可以通过 npm 安装它们、需要它们并将它们付诸实践。
模块作为中间件
如果你深入研究 Connect 的工作原理,你会发现每一层实际上都是一个 Node 模块——这是一个非常智能的设计。如果您将 Connect 用于大型应用程序,那么以 Node 模块格式编写代码将是理想的选择。您可能有一个 app.js
文件,如下所示:
// app.js module.exports = function (req, res, next) { res.end("this comes from a module"); };
在你的 server.js
中:
var connect = require("connect"), app = require("./app"); connect() .use(app) .listen(3000);
结论
如果您想要一个适合初学者的库来轻松构建大型 Web 应用程序,那么 Connect 不是您的解决方案。 Connect 旨在成为原始 Node API 之上的一个薄层,让您可以完全控制服务器应用程序。如果你想要更多,我推荐 Express(顺便说一下,是同一个人做的)。除此之外,Connect 是一个出色的、可扩展的 Node Web 应用程序库。
以上がConnect フレームワークで接続するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

WebStorm Mac版
便利なJavaScript開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
