正确使用express.js API,如get,send,redirect

时间:2014-12-18 08:53:18

标签: javascript node.js express

我对网络开发还很陌生,刚开始使用node并表达4.9.0。

已经完成了一些教程并使用了API。据我所知,http协议和请求URL是Web应用程序的支柱。例如,我们必须操纵URL以将用户重定向到另一个页面或上传文件。 POST用于提交数据,GET用于请求数据。此外,response.send()用于将服务器的响应发送回客户端。根据nodejs docs,我们最后也必须有response.end()(我认为这对于express来说是相同的。)

来到快递部分 - 这里有一些我试过的例子,不明白他们为什么不工作:

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

动机:找出response.send()做了什么,我可以在不同的地方向客户发送不同的信息部分。

我希望express能够处理第一个app.get,然后按照next()到我们的下一个app.get。最后,输出"欢迎来到主页!"和#34;欢迎来到第二页!"。但是,应用程序与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。为什么我们需要快速路由器? 请注意,从快速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.正常表达已经是中间件本身,我们可以使用它做路由?

1 个答案:

答案 0 :(得分:3)

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])
  

此方法向服务器发出信号,表示已发送所有响应标头和正文;该服务器应该考虑此消息完成。必须在每个响应上调用方法response.end()。

     

如果指定了数据,则相当于调用response.write(data,encoding),后跟response.end()。

如果情况并非如此,那么每次发出http请求时,请求者都不知道何时停止收听响应并随后发生灾难。

如果您想从不同的地方(即从您申请中的不同地方)发送各种信息,我建议收集来自不同地方的所有信息,然后一下子结束并发送信息。< / p>

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(...))可能会暂时为您提供足够的服务。

祝你好运