[英]Proper use of express.js API like get, send, redirect
我是網絡開發的新手,剛開始使用node和express 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。 最后,輸出“歡迎來到主頁!” 和“歡迎來到第二頁!”。 但是,應用程序崩潰了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();
幾乎相同var app = express();
文檔還說Routers behave like middleware themselves and can be ".use()'d" by the app or in other routers.
是不是普通的表達本身就已經是中間件了,我們可以用它來做路由嗎?
向node.js服務器發出的每個http請求都需要一個響應,之后連接結束。 如果你想發送多條信息,你可以打開一個websocket連接( http://socket.io/ - 這很容易)。 http://maxogden.com/node-streams.html
response.send([status], body)
是response.end()
的替代品( 更多信息 )
來自node.js文檔 :
response.end([data], [encoding])
此方法向服務器發出信號,表示已發送所有響應標頭和正文; 該服務器應該考慮此消息完成。 必須在每個響應上調用方法response.end()。
如果指定了數據,則相當於調用response.write(data,encoding),然后調用response.end()。
如果不是這種情況,則每次發出http請求時,請求者都不知道何時停止偵聽響應並且隨后發生災難。
如果您想從不同的地方(即從您應用程序中的不同位置)發送各種信息,我建議收集來自所述各個地方的所有信息,然后結束並一次性發送信息。
使用app.set
當你想設置的應用程序范圍內的屬性和使用app.get
當你想要檢索所述屬性的值。
app.set('port', config.port);
然后在app.listen(app.get('port'), function(){ ... });
在我看來,使用app.get('/', function(req, res){ ... })
是一個令人困惑的過度加載 。
我認為更好的選擇使用這種格式的東西:
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'))
...
在您的示例中,您總是會遇到重定向問題,因為您嘗試將響應代碼設置兩次(哪個節點不允許 )。 一次為200(OK) ,然后一次當您嘗試重定向請求時, 默認情況下為302響應代碼。
這是孤立的(即假設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(...)
)可能會暫時為你提供足夠的服務。
祝你好運
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.