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

我对web开发相当陌生,刚刚开始在节点上expression4.9.0。

已经通过一些教程,并玩了API。 据我所知,http协议和请求的url是一个Web应用程序的骨干。 例如,我们必须操纵url来将用户redirect到另一个页面或上传文件。 POST用于提交数据,GET用于请求数据。 此外, response.send()用于将服务器的响应发送回客户端。 根据nodejs文档,我们还必须在最后有response.end() ,(我认为这对于express来说是一样的)。

来快速部分 – 这里是我试过的一些例子,不明白为什么他们不工作:

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

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

我期望快递处理第一个app.get,然后按照下一个()到我们的下一个app.get。 最后输出“欢迎来到首页!” 和“欢迎来到第二页!”。 但是,应用程序崩溃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() ,它会成功find下一个带有参数"/" app.get 。 这也适用于如果我们用app.getreplaceapp.set

3.redirect尝试redirect到另一个外部网站,或我的网站的另一个页面,但得到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.在两个地方调用response.send()

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

response.send([status], body)response.end()的替代方法response.end() ( 更多信息 )

从node.js文档 :

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

这个方法发信号给服务器,所有的响应标题和主体已经被发送; 该服务器应该考虑完成此消息。 response.end()方法必须在每个响应中调用。

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

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

如果你想发送来自不同地方的各种信息(例如你的应用程序中的不同地方),我build议从各地收集所有的信息,然后一下子收集和发送信息。

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

如果要设置应用程序范围的属性,请使用app.get ,如果要检索该属性的值,请使用app.get

app.set('port', config.port); 然后在app.listen(app.get('port'), function(){ ... });

在我看来, app.get('/', function(req, res){ ... })是一个令人困惑的过载 。

我相信一个更好的select使用这种格式的东西:

 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(虽然这正是我喜欢如何构build一个项目)

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

3.redirect

在你的例子中,你总是会有一个问题redirect,因为你试图设置响应代码两次(哪个节点不允许 )。 一次为200(OK) ,然后一次当您尝试redirect请求时,这是一个默认的302响应代码。

这是孤立的(即给定的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(...) )暂时可能会帮助你。

祝你好运