2016-05-19 19 views
6

Trong Nút bằng Express, tôi có một đoạn mã như thế này.Trong Express.js tại sao mã sau res.json() vẫn thực thi?

if (req.body.var1 >= req.body.var2){ 
     res.json({success: false, message: "End time must be AFTER start time"}); 
     console.log('Hi') 
} 
console.log('Hi2') 
//other codes 

Tôi mong rằng nếu var1 là> = var2, phản hồi sẽ được gửi và thực thi sẽ kết thúc. Giống như các câu lệnh trả về trong Java/C#

Nhưng không phải vậy. Sau khi phản hồi được gửi, cả 'Hi' và 'Hi2' và tất cả các mã khác sau đó tiếp tục được thực hiện.

Tôi đã tự hỏi làm cách nào để ngăn điều này xảy ra?

Ngoài ra, tôi đã tự hỏi trong trường hợp nào bạn thực sự muốn mã để tiếp tục thực hiện sau khi một phản hồi đã được gửi đi.

Chúc mừng

Trả lời

9

Express chỉ gọi hàm JavaScript cho tuyến đường trùng khớp. Không có phép thuật đặc biệt nào để biết khi hàm hoàn thành/không hoàn chỉnh. Nó chỉ chạy hàm. Tuy nhiên, rất dễ dàng để thoát khỏi chức năng bất cứ khi nào bạn muốn ...

Bạn có thể sử dụng return để ngừng thực hiện cuộc gọi lại cho một tuyến đường cụ thể. Nó chỉ hoạt Javascript ... hàm sẽ luôn cố gắng để chạy đến khi kết thúc

app.post('/some/route', (req, res)=> { 
    if (req.body.var1 >= req.body.var2){ 
    // note the use of `return` here 
    return res.json({success: false, message: "End time must be AFTER start time"}); 
    // this line will never get called 
    console.log('Hi') 
    } 
    // this code will only happen if the condition above is false 
    console.log('Hi2') 
    //other codes 
}); 

Cảnh báo về chuỗi comparsion

Bạn đang sử dụng

req.body.var1 >= req.body.var2 

Tất cả các giá trị dạng HTML được gửi đến máy chủ dưới dạng chuỗi.

// javascript string comparison 
"4" > "3" //=> true 
"4" > "30" //=> true 
parseInt("4", 10) > parseInt("30", 10) //=> false 

Tôi chắc chắn bạn sẽ cần phải thực hiện so sánh có giáo dục hơn thế. Có vẻ như chúng là giá trị thời gian? Vì vậy, bạn có thể muốn chuyển đổi các giá trị đó thành các đối tượng Date và so sánh chính xác.

+1

Có, chúng là giá trị số nguyên cho giây. Cảm ơn bạn đã cảnh báo! Tôi cho rằng tôi sẽ cần phải phân tích chúng như bạn đã làm? Tôi không biết rằng mọi thứ đều được gửi dưới dạng chuỗi. Điều đó có thể khiến tôi rất đau đầu. Cám ơn rất nhiều. – Synia

5

Đơn giản chỉ cần quay trở lại sau khi res.json chức năng:

res.json({success: false, message: "End time must be AFTER start time"}); 
return; // This will stop anything else from being run 
0

Bạn có thể trở lại với res.json quá.

if (req.body.var1 >= req.body.var2){ 
return res.status(400).json({success: false, message: 'your message'}) 
} 
Các vấn đề liên quan