正确使用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.get
replaceapp.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(...)
)暂时可能会帮助你。
祝你好运