我对网络开发还很陌生,刚开始使用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.
正常表达已经是中间件本身,我们可以使用它做路由?
答案 0 :(得分:3)
对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>
如果要设置应用程序范围的属性,请使用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'))
...
在您的示例中,您总是会遇到重定向问题,因为您尝试将响应代码设置两次(node doesn't allow)。一次为200 (OK),然后在您尝试重定向302响应代码by default的请求时一次。
这是孤立的(即假设200响应代码未被设置)起作用:
app.get("/", function(request, response) {
response.redirect('http://google.com');
});
我们没有。我对快递路由器的看法是
var router = express.Router([options]);
...
app.use('/calendar', router);
可用于对API的特定部分进行分区,并以适合您的方式安排代码。
我认为上面的示例(使用app.route('/something').get(...)
)可能会暂时为您提供足够的服务。
祝你好运