搜索
首页web前端js教程与 Connect 框架连接

与 Connect 框架连接

NodeJS 的新手通常会发现它的 API 很难掌握。幸运的是,许多开发人员已经创建了可以更轻松地使用 Node.js 的框架。 Connect 就是这样一个框架。它位于 Node 的 API 之上,在舒适性和控制性之间划定了界限。

将 Connect 视为中间件堆栈。对于每个请求,Connect 都会通过中间件层进行过滤,每个中间件层都有机会处理 HTTP 请求。当 T.J. Holowaychuk 宣布了 Connect,他说有两种类型的中间件。第一个是过滤器

过滤器处理请求,但不响应它(想想服务器日志记录)。

另一种类型是提供者,它响应请求。您可以根据需要合并任意数量的中间件;请求会遍历每一层,直到其中一个中间件响应该请求。


基本语法

首先,您需要通过npm安装Connect包:

npm install connect

现在创建一个server.js文件,并添加以下代码:

var connect = require("connect");

connect 变量是一个返回新 Connect 应用程序的函数。因此,我们的下一步是创建该应用程序:

var app = connect();

您不需要为大多数应用程序创建 app 变量。创建应用程序涉及的函数(connect()use()) 是可链接的:

connect()
    .use(/* middleware */)
    .use(/* middleware */)
    .listen(3000);

use() 函数向应用程序添加了一层中间件,而 listen() 函数告诉我们的应用程序开始接受指定端口(本例中为 3000)上的连接。

让我们从简单的事情开始:日志记录。仅使用日志记录中间件的 Connect 应用程序的代码相当简单:

connect()
    .use(connect.logger())
    .listen(3000);

默认情况下,Node 会解析很少的传入请求。

将该代码添加到您的文件中,然后通过运行 node server.js 启动服务器。导航到浏览器中的任何路径,并忽略“无法获取...”结果。我们对服务器发送回浏览器的内容不感兴趣;我们对服务器的日志感兴趣。查看终端,您将看到您的请求日志。请务必查看记录器文档以获取有关其其他功能和自定义的信息。

那是一个过滤器;现在让我们看看一个提供者。最简单的提供者是静态提供者;它提供指定文件夹中的静态文件。这是它的语法:

.use(connect.static(__dirname + "/public")

你大概可以猜到 Node 的 __dirname 变量的用途:它是当前目录的路径。该中间件静态地提供当前目录中 public 文件夹中的任何内容。因此,创建 public/page.html 并添加 <h1></h1> 元素。重新启动服务器(__dirname 变量的用途:它是当前目录的路径。该中间件静态地提供当前目录中 public 文件夹中的任何内容。因此,创建 public/page.html 并添加 <h1></h1> 元素。重新启动服务器(node server.js),然后在浏览器中导航到 localhost:3000/page.html。您应该在浏览器中呈现 page.html),然后在浏览器中导航到 localhost:3000/page.html。您应该在浏览器中呈现 page.html

现在让我们快速浏览一下 Connect 的其他一些中间件选项。


解析请求体

默认情况下,Node 会解析很少的传入请求,但如果需要处理更复杂的情况,可以合并多个不同的过滤器来解析请求。有四个过滤器:

  • connect.json() 解析 JSON 请求体(其中 content-typeapplication/json)。
  • connect.urlencoded() 解析 x-ww-form-urlencoded 请求体。
  • connect.multipart() 解析 multipart/form-data 请求体。
  • connect.bodyParser() 是启用上述所有三个功能的快捷方式。

使用任何这些过滤器都可以让您通过 request.body 访问已解析的正文(我们很快就会讨论如何获取 request 对象)。

我认为这些过滤器是如何通过 Connect 细粒度控制的一个很好的例子。您可以使用很少的处理来简化您的应用程序。


Cookie 和会话是任何 Web 应用程序的重要组成部分,有多个中间件可以帮助管理它们。 connect.cookieParser() 会为您解析 cookie,您可以通过 request.cookies 对象检索 cookie 及其值。如果您将 connect.session() 过滤器添加到您的应用程序中,这会更有用。此过滤器要求 cookie 解析器已就位。这是一个小例子:

connect()
    .use(connect.cookieParser())
    .use(connect.session({ secret: 'some secret text', cookie: { maxAge: 30000 }}))
    .use(function(req, res) {
        var sess = req.session,
            url = req.url.split("/");

    if (url[1] == "name" && url[2]) {
        sess.name = url[2];
        res.end("name saved: " + url[2]);
    } else if (sess.name) {
        res.write("session-stored name: " + sess.name);    
        res.end("stored for another: " + (sess.cookie.maxAge / 1000) + " seconds");
    } else {
        res.end("no stored name; go to /name/{name} to save a name");
    }
}).listen(3000);

您编写的每个中间件函数都需要将请求传递到 next 层或响应请求。

cookieParser 之后,我们包含 session 过滤器并传递给它两个选项:

  • 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()

现在,那些 requestresponse 参数怎么样?这些与您在使用“原始”节点服务器时收到的请求和响应对象完全相同:

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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
超越浏览器:现实世界中的JavaScript超越浏览器:现实世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

使用Next.js(后端集成)构建多租户SaaS应用程序使用Next.js(后端集成)构建多租户SaaS应用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

如何使用Next.js(前端集成)构建多租户SaaS应用程序如何使用Next.js(前端集成)构建多租户SaaS应用程序Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

JavaScript:探索网络语言的多功能性JavaScript:探索网络语言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

JavaScript的演变:当前的趋势和未来前景JavaScript的演变:当前的趋势和未来前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

神秘的JavaScript:它的作用以及为什么重要神秘的JavaScript:它的作用以及为什么重要Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python还是JavaScript更好?Python还是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。 1.Python以简洁语法和丰富库生态着称,适用于数据分析和Web开发。 2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安装JavaScript?如何安装JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。