2011-10-03 23 views
23

Tôi có định nghĩa bộ điều khiển/định tuyến sau trong Node.js (sử dụng Express và Mongoose). Cách nào phù hợp nhất để xử lý Lỗi khi người dùng yêu cầu một trang không tồn tại?Node.js/Express - Hiển thị lỗi khi không tìm thấy trang

app.get('/page/:pagetitle', function(req, res) { 
     Page.findOne({ title: req.params.pagetitle}, function(error, page) { 
      res.render('pages/page_show.ejs', 
      { locals: { 
       title: 'ClrTouch | ' + page.title, 
       page:page 
      } 
      }); 
     }); 
    }); 

Nó hiện đang vi phạm ứng dụng của tôi. Tôi tin rằng bởi vì tôi không làm bất cứ điều gì với các lỗi tôi chỉ cần đi qua nó để xem như một thành công?

TypeError: Cannot read property 'title' of null 

Cảm ơn nhiều.

Trả lời

46

Kiểm tra ví dụ rõ ràng error-pages. Nguyên tắc là đăng ký tuyến ứng dụng của bạn trước, sau đó bạn đăng ký bắt tất cả trình xử lý 404 cho tất cả các yêu cầu khác không ánh xạ tới tuyến đường. Cuối cùng, một bộ xử lý 500 được đăng ký, như sau:

// "app.router" positions our routes 
// specifically above the middleware 
// assigned below 

app.use(app.router); 

// Since this is the last non-error-handling 
// middleware use()d, we assume 404, as nothing else 
// responded. 

app.use(function(req, res, next){ 
    // the status option, or res.statusCode = 404 
    // are equivalent, however with the option we 
    // get the "status" local available as well 
    res.render('404', { status: 404, url: req.url }); 
}); 

// error-handling middleware, take the same form 
// as regular middleware, however they require an 
// arity of 4, aka the signature (err, req, res, next). 
// when connect has an error, it will invoke ONLY error-handling 
// middleware. 

// If we were to next() here any remaining non-error-handling 
// middleware would then be executed, or if we next(err) to 
// continue passing the error, only error-handling middleware 
// would remain being executed, however here 
// we simply respond with an error page. 


app.use(function(err, req, res, next){ 
    // we may use properties of the error object 
    // here and next(err) appropriately, or if 
    // we possibly recovered from the error, simply next(). 
    res.render('500', { 
     status: err.status || 500 
    , error: err 
    }); 
}); 
+0

Vâng, tôi cảm thấy như tôi đã trải qua các ví dụ Express. Nhưng điều này khá hữu ích. Tôi đã tạo ra 500.ejs, v.v. của riêng mình ... trong các khung nhìn và bây giờ chúng sẽ hiển thị khi cần thiết nhưng tôi có thể thêm các thông báo lỗi của riêng tôi khi được chỉ định. Cảm ơn. – tuddy

+1

Khi tôi thêm vào app.use() với việc xử lý 404, nó sẽ làm hỏng tất cả các tuyến đường của tôi trong các thư mục công cộng vì một số lý do. Giống như /stylesheets/style.css bị mất đột ngột, vì nó thường được truy cập từ mẫu ejs của tôi. Bất cứ đề nghị cho điều này? – netpoetica

+0

Tôi đã có thể khắc phục vấn đề với phần mềm trung gian app.use() trung gian phá vỡ đường dẫn tĩnh của tôi bằng cách di chuyển app.use (tĩnh ....) trước ví dụ được đưa ra ở đây – netpoetica

3

Một trong những vấn đề lớn với Node.JS là không có lỗi bắt sạch. Cách thông thường thường cho mỗi hàm callback là, số đầu tiên là không null nếu có lỗi, vì vậy ví dụ:

function(error, page){ 
    if(error != null){ 
     showErrorPage(error, req, res); 
     return; 
    } 
    ...Page exists... 
} 

Những điều có thể nhận xấu xí sau một thời gian với quá nhiều callbacks, và tôi khuyên bạn nên sử dụng một cái gì đó như async, để nếu có một lỗi, nó sẽ chuyển trực tiếp đến một cuộc gọi lại lỗi.

EDIT: Bạn cũng có thể sử dụng express error handling.

+0

+1 cho câu trả lời của bạn, vì nó hữu ích. Không nên có 'undefined' thay vì' null'. –

+0

@SushantGupta no, ** Nican ** là chính xác. Nó hoặc là null hoặc có đối tượng lỗi. –

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