javascript - 正确使用 express.js API,如获取、发送、重定向

标签 javascript node.js express

我是网络开发的新手,刚刚开始使用 node 和 express 4.9.0。

已经学习了一些教程并试用了 API。据我了解,http 协议(protocol)和请求 url 是网络应用程序的支柱。例如,我们必须操纵 url 将用户重定向到另一个页面或上传文件。 POST 用于提交数据,GET 用于请求数据。另外,response.send()用于将服务器的响应发送回客户端。我们还必须有 response.end()最后,根据 nodejs 文档(我认为这与 express 相同)。

来到表达部分——这里有一些我试过但不明白为什么它们不起作用的例子:

<强>1。在两个地方调用 response.send()

动机:想知道response.send()到底是干什么的,能不能在不同的地方给client发送不同的信息。

我希望 express 处理第一个 app.get,然后跟随 next() 到我们的下一个 app.get。最后输出“Welcome to the homepage!”和“欢迎来到第二页!”。但是,该应用程序崩溃了 net::ERR_EMPTY_RESPONSE .为什么会这样?

var express = require("express");
var http = require("http");
var app = express();

app.all("*", function(request, response, next) {
  response.writeHead(200, { "Content-Type": "text/plain" });
  next();
});

app.get("/", function(request, response, next) {
 response.send("Welcome to the homepage!");
 next();
});

app.get("/", function(request, response) {
  response.end("Welcome to the second page!");
});

app.get("*", function(request, response) {
  response.end("404!");
});

http.createServer(app).listen(1337);

<强>2。什么时候使用 app.get 和 app.set? 尝试互换它们,它们通常有相似的行为。 例如,如果我们删除错误的 response.send()在第一个示例中,它成功找到了下一个 app.get带参数 "/" .如果我们替换 app.get,这也有效与 app.set

<强>3。重定向 尝试重定向到另一个外部站点或我站点的另一个页面,但得到了 net::ERR_EMPTY_RESPONSE

app.all("*", function(request, response, next) {
  response.writeHead(200, { "Content-Type": "text/plain" });
  next();
});

app.get("/", function(request, response) {
 response.redirect("http://google.com");
 //also does not work with response.redirect("/about);

});

app.get("/about", function(request, response) {
 response.end("about page");
});

<强>4。为什么我们需要快速路由器? 读到路由器从 express 3.x 到 4.x 发生了重大变化。此处使用 4.9.0。

var router = express.Router([options]);

路由器的 synatx 和 api 与使用普通旧版几乎相同 var app = express();该文档还说 Routers behave like middleware themselves and can be ".use()'d" by the app or in other routers.普通的express本身不就是一个中间件,我们可以用它来做路由吗?

最佳答案

1。在两个地方调用 response.send()

向 node.js 服务器发出的每个 http 请求都需要一个响应,之后连接将结束。如果你想发送多条信息,你可以打开一个 websocket 连接(http://socket.io/ - 这很容易)。 http://maxogden.com/node-streams.html

response.send([status], body)response.end() ( more information )

的替代方法

来自node.js docs :

response.end([data], [encoding])

This method signals to the server that all of the response headers and body have been sent; that server should consider this message complete. The method, response.end(), MUST be called on each response.

If data is specified, it is equivalent to calling response.write(data, encoding) followed by response.end().

如果不是这种情况,每次发出 http 请求时,请求者都不知道何时停止监听响应,灾难随之而来。

如果你想从不同的地方发送各种信息(即从你的应用程序中的不同地方),我会建议从所说的各个地方收集所有信息,然后打包并一次性发送信息。

2.什么时候使用app.get和app.set

当您想要设置应用程序范围的属性时使用app.set,当您想要检索所述属性的值时使用app.get

.e.g app.set('port', config.port); 然后是 app.listen(app.get('port'), function(){ 。 .. });

在我看来,app.get('/', function(req, res){ ... }) 的使用是 over-loading 的一个令人困惑的片段.

我相信更好的选择是使用这种格式:

app.route('/my-objects')
   .get(function(request, response){ /* handle get request (maybe get a list of said objects) */ })
   .post(function(request, response){ /* handle post request (maybe create a new object)*/ })
   .put(function(request, response){ /* handle put request */ })
   .delete(function(request, response){ /* handle delete request */ });

或者更好的是 imo(尽管这正是我喜欢构建项目的方式)

app.route('/my-objects')
   .get(require('./routes/my-objects/get'))
   .put(require('./routes/my-objects/put'))
   ...

3。重定向

在您的示例中,您总是会遇到重定向问题,因为您试图设置两次响应代码(node doesn't allow)。一次为200 (OK) ,然后当您尝试重定向请求时一次 302响应码 by default .

这在孤立的情况下(即假设未设置 200 响应代码)有效:

app.get("/", function(request, response) {
    response.redirect('http://google.com');
});

4。为什么我们需要快速路由器?

我们没有。我对快速路由器的看法

var router = express.Router([options]);
...
app.use('/calendar', router);

可用于划分 API 的特定部分,并以适合您的方式安排您的代码。

我认为上面的示例(使用 app.route('/something').get(...))暂时可能会很好地为您服务。

祝你好运

关于javascript - 正确使用 express.js API,如获取、发送、重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27542507/

相关文章:

javascript - 当部分 View 加载到 Jquery 选项卡时,我尝试打开 Jquery 对话框时出错

javascript - CSS 过渡突然停止

javascript - 打开模态,然后在不重定向的情况下更改 url

node.js - 如何在 firebase 上使用已部署的应用程序和已部署的函数存储数据

node.js - Heroku 裸 SSL 自定义域

javascript - Function.prototype.apply.bind 用法?

javascript - 如何将 : Pass node. js mongodb 结果转换为 angularjs?

node.js - 获取传入请求的 HTTP 版本

node.js - 如何捕获像 EADDRINUSE 这样的 node.js/express 服务器错误?

angularjs - 如何将倒计时器同步给所有用户