簡體   English   中英

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

[英]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.getapp.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. 是不是普通的表達本身就已經是中間件了,我們可以用它來做路由嗎?

1.在兩個地方調用response.send()

向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請求時,請求者都不知道何時停止偵聽響應並且隨后發生災難。

如果您想從不同的地方(即從您應用程序中的不同位置)發送各種信息,我建議收集來自所述各個地方的所有信息,然后結束並一次性發送信息。

2.何時使用app.get和app.set

使用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'))
   ...

3.重定向

在您的示例中,您總是會遇到重定向問題,因為您嘗試將響應代碼設置兩次(哪個節點不允許 )。 一次為200(OK) ,然后一次當您嘗試重定向請求時, 默認情況下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(...) )可能會暫時為你提供足夠的服務。

祝你好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM