2013-04-14 36 views
12

Tôi có câu hỏi noob rất đơn giản về node.js. Làm cách nào để chuyển một biến sang hàm tuyến đã xuất?Biến vượt qua Node.js để định tuyến

Tuyến nộp

exports.gettop = function(n, req, res) { 
    console.log(n); 
    res.send(200); 
}; 

file server

app.get('/api/v1/top100', routes.gettop(100)); 

Lỗi: .get() yêu cầu chức năng gọi lại nhưng có một [đối tượng Undefined]

Trả lời

25

Ví dụ, bạn muốn tạo một hàm mới sẽ đóng xung quanh giá trị của bạn là n. Trong trường hợp của bạn, bạn đang thực hiện gettop và chuyển giá trị trả lại để thể hiện dưới dạng tuyến đường của bạn, có nghĩa là gettop cần phải trả lại trình xử lý tuyến đường. (! Rất hợp lệ)

exports.gettop = function(n){ 
    return function(req, res) { 
     console.log(n); 
     res.send(200); 
    }; 
}; 
7

Để thay thế cho loganfsmyth của giải pháp, bạn có thể rời khỏi chức năng gettop của bạn như nó vốn có và tạo một hàm từng phần:

app.get('/api/v1/top100', routes.gettop.bind(null, 100)); 
+0

Điều này đã cứu tôi Rất nhiều đau đầu và thời gian! Cảm ơn! – Tobi

+0

Kỳ lạ, logic này không hoạt động khi hàm ràng buộc (routes.gettop) là một phương thức 'kế thừa' (tức là, được định nghĩa trong chuỗi nguyên mẫu của đối tượng chứ không phải là một phương thức riêng của nó). Trình xử lý thực sự được đăng ký, nhưng nó không bao giờ được gọi! – LexLythius

+0

@LexLythius rằng nó không bao giờ được gọi là âm thanh lạ. Tôi có thể tưởng tượng rằng nó được gọi với bối cảnh không chính xác, mà trong ví dụ của tôi là 'null' nhưng đối với một phương thức ràng buộc có thể là instance (' routes'). – robertklep

13

Là mã của bạn trông giống như bạn bằng cách sử dụng tốc độ, bạn có thể sử dụng người dân địa phương và người dân địa phương kết quả rõ ràng để chuyển các biến số cho tuyến đường của bạn. Trong khi các câu trả lời khác đề xuất các giải pháp làm việc tôi nghĩ rằng nó ít gây khó chịu khi sử dụng các cơ chế thể hiện để thiết lập các biến này.

Với người trả lời địa phương (See Express API reference) trước tiên bạn phải đặt biến ở đâu đó trong phần giữa hoặc tuyến đường. Tôi sẽ chỉ cho cách tiếp cận middleware

app.use(function(req,res, next) { 
    res.locals.top = 200; 
    next(); 
}); 

sau đó trong con đường của bạn, bạn có thể truy cập vào khách sạn này qua res.locals.variablename

exports.gettop = function(req, res) { 
    console.log(res.locals.top); 
    res.send(200); 
}; 

Trong trường hợp bạn muốn làm cho các ứng dụng thiết lập rộng một cách tiếp cận tốt hơn là sử dụng người dân địa phương ứng dụng (See Express API reference)

để thiết lập một người dân địa phương ứng dụng biến bạn có thể sử dụng

app.locals.top = 100; 

Để truy cập biến này từ tuyến đường của bạn sử dụng

exports.gettop = function(req, res){ 
    console.log(req.app.locals.top); 
    res.send(200); 
}; 
+1

Trong trường hợp đó, tôi thích 'app.set (...)' và '[req.] App.get (...)', vì điều đó sẽ không có bất kỳ tác dụng phụ nào (vì người dân địa phương được chuyển đến các mẫu). – robertklep

+0

Tôi phải gọi 'next()' bên trong hàm middleware để trang không bị treo. –

+0

@AmirEldor cảm ơn! Đã khắc phục sự cố – saintedlama

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