2012-02-02 33 views
30

Im cố gắng để chỉ dừng lại yêu cầu bài sau khi tôi đã lưu một tài liệu vào DB, ví dụ:Cách kết thúc trả lời POST.js/node?

app.post('/blah'), function(req,res){ 
//my code does a bunch of stuff 

res.what do i put here to tell the client browser to just... stop the POST 
} 

Tại im lúc chỉ đơn giản là sử dụng res.redirect('back') mà làm việc, nhưng làm mới trang là hoàn toàn tùy ý và tôi sẽ thích nó không xảy ra. Tôi đã đi theo số res.end(); nhưng điều đó sẽ đưa khách hàng đến một trang trống ...

Xin cảm ơn trước.

chỉnh sửa:

Tôi không nghĩ rằng tôi đã làm bản thân mình đủ rõ ràng trong những gì im làm xin lỗi.

Có lẽ thói quen xấu của mình nhưng đây là whats xảy ra:

  1. POST tu cơ sở dữ liệu lưu chức năng

  2. Trình duyệt ngồi xung quanh chờ đợi một phản ứng

  3. Khi nó tốt và sẵn sàng, obj được lưu vào DB, sau đó gọi lại kích hoạt chức năng NowJS, sẽ thêm mục vào chế độ xem (cho tất cả mọi người)

tôi đã làm nó theo cách này là non-blocking (vì vậy tôi nghĩ)

+0

res.end() hoặc với res.json nếu bạn trả lại một số phản hồi json. – Prashanth

Trả lời

40

Bạn có thể sử dụng res.end và vượt qua trong một chuỗi mà bạn muốn được gửi cho khách hàng:

res.end('It worked!'); 

Ngoài ra, bạn có thể render a view và sau đó kết thúc phản ứng:

res.render('blah.jade'); 
res.end(); 

Tất cả những gì cho biết, chuyển hướng khách hàng thực sự là phương pháp hay nhất. Nó làm cho nó để khi họ nhấn nút quay lại trong trình duyệt của họ, họ có thể di chuyển trở lại liền mạch mà không nhận được bất kỳ "POST yêu cầu" popup hoặc tương tự. Đây là mẫu POST/chuyển hướng và bạn có thể đọc thêm về nó tại http://en.wikipedia.org/wiki/Post/Redirect/Get.

+3

Bạn không cần res.end sau res.render. Mẫu POST/chuyển hướng là cách để đi - trừ khi POST là thông qua JSON hoặc XMLHttpRequest. Bạn có thể kiểm tra cả hai thứ đó và nếu yêu cầu thành công, chỉ cần gửi res.json (200) hoặc res.send (200) (hoặc một số mã phản hồi 200 dải RESTful khác). – danmactough

+0

res.end ('Đã hoạt động!'); đưa người dùng đến trang có nội dung 'Nó hoạt động!' –

+0

Tôi có cùng một câu hỏi. Tôi không muốn nó chuyển sang bất kỳ trang nào khác hoặc làm mới trang hiện tại. Có cách nào để làm điều đó? res.redirect ('back') hoặc res.end() vừa là làm mới hoặc gửi người dùng đến trang khác. Tôi muốn giữ nó trên cùng một trang. – Tenz

0

Trình duyệt khách hàng đang chờ đợi một phản ứng. Vì vậy, tại sao không cho nó một cái gì đó với một cái gì đó như res.send('<p>Thank you</p>'); hoặc một cái nhìn tốt đẹp rendered?

Lý do res.end() gửi khách hàng đến trang trống là bạn không cung cấp cho khách hàng bất kỳ thứ gì để hiển thị.

+0

Những gì im thực sự làm là kích hoạt NowJS để asynch'ly cập nhật trang cũng như cập nhật cơ sở dữ liệu của tôi. Vì vậy, trang đã được cập nhật với nội dung mới, trình duyệt chỉ không biết nó. Tôi đã cập nhật câu hỏi của mình để phản ánh điều này. –

1

Nếu bạn có thể sửa đổi mã phía máy khách để thực hiện yêu cầu đăng qua AJAX, bạn có thể chỉ cần sử dụng res.end().

Vấn đề ở đây là khi trình duyệt thực hiện yêu cầu POST (không qua AJAX), nó không còn quan tâm đến trang hiện tại nữa. Nó đang mong đợi một trang mới, vì vậy nó sẽ tải một trang mới. Điều này hoàn toàn là với trình duyệt, và tôi không tin rằng hiện tại có một cách để bạn làm việc xung quanh nó.

Nhìn chung, bạn chỉ nên sử dụng yêu cầu AJAX POST nếu có thể.

3

Trong khi bạn có thể sử dụng cơ bản end phương pháp vay mượn từ mô-đun http Node của, Express.js có send phương pháp riêng của mình mà các cuộc gọi end khi thích hợp:

/** 
* Send a response. 
* 
* Examples: 
* 
*  res.send(new Buffer('wahoo')); 
*  res.send({ some: 'json' }); 
*  res.send('<p>some html</p>'); 
*  res.send(404, 'Sorry, cant find that'); 
*  res.send(404); 
* 
* @param {Mixed} body or status 
* @param {Mixed} body 
* @return {ServerResponse} 
* @api public 
*/ 
res.send = function(body){ 
    . 
    . 
    . 

    // respond 
    this.end(head ? null : body); 
    return this; 
}; 
+0

làm thế nào bạn có thể làm cho express không gọi phương thức 'end' –

0

Cách tốt nhất để kết thúc định tuyến nhanh mà không cần định tuyến để trang mới hoặc những gì bao giờ mess express muốn bạn không ở lại trên trang hiện tại mặc dù bạn có lý do riêng của bạn là sử dụng window.stop, ví dụ như một hình thức, bạn sử dụng javascript để xử lý trình, thời gian chờ là đủ để đảm bảo dữ liệu được gửi dưới dạng phương thức POST.

document.myform.mysubmit.click() 
    setTimeout(function(){ 
     window.stop() 
    }, 3000); 
3

Để tham khảo trong tương lai, bạn cũng có thể làm:

res.redirect('back'); 

Về cơ bản này chỉ chuyển hướng trình duyệt trở lại màn hình theo yêu cầu đến từ đâu, hay nói cách khác "làm mới" nó. Đó là hacky và tôi muốn có một cách tốt hơn, nhưng nó hoạt động.

Các vấn đề liên quan