2012-01-14 33 views
44

Vì vậy, tôi bắt đầu sử dụng Node.js. Tôi đã xem video với Ryan Dahl trên Nodejs.org và nghe anh ấy đề xuất Express-js cho các trang web.Sử dụng các tuyến đường trong Express-js

Tôi đã tải xuống phiên bản Express mới nhất và bắt đầu viết mã. Tôi có một cái nhìn tĩnh có đầy đủ tư lên trên /, nhưng ngay sau khi tôi thử gửi các thông số, tôi nhận được lỗi như thế này:

Cannot GET /wiki 

Tôi thử làm theo các hướng dẫn trên expressjs.com nhưng cách một sử dụng các tuyến đường đã thay đổi trong phiên bản mới nhất, làm cho hướng dẫn không sử dụng được.

Guide:

app.get('/users/:id?', function(req, res, next){ 
    var id = req.params.id; 
    if (id) { 
     // do something 
    } else { 
     next(); 
    } 
}); 

Generated by Express:

app.get('/', routes.index); 

Vấn đề của tôi nảy sinh khi tôi cố gắng và thêm một con đường khác.

app.get('/wiki', routes.wiki_show); 

Tôi đã thử một loạt các cách tiếp cận, nhưng tôi vẫn gặp lỗi Cannot GET /wiki (404).

tuyến/index.js trông như thế này:

exports.index = function(req, res) { 
    res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections }) 
}; 

Điều duy nhất tôi làm là có thêm một số thông số (mảng trong cùng một tập tin) và i này làm việc. Nhưng khi tôi sao chép nội dung và thay đổi exports.index thành exports.wiki hoặc exports.wiki_show Tôi vẫn gặp lỗi Cannot GET /wiki.

Có ai có thể giải thích cho tôi điều tôi đang thiếu ở đây không? - Cảm ơn.

+0

Bạn đã thêm phần mềm trung gian của bộ định tuyến chưa? – fent

+0

Bạn đã tải xuống Express mới nhất? Bạn đã nhận được nó từ github hoặc thông qua NPM? –

+1

@DeaDEnD Có, tôi khá chắc chắn về điều đó :) –

Trả lời

72

Vì vậy, sau khi tôi tạo câu hỏi của mình, tôi nhận danh sách liên quan này ở bên phải với một vấn đề tương tự: Organize routes in Node.js.

Câu trả lời trong bài đăng đó được liên kết với số Express repo on GitHub và đề xuất xem ví dụ 'route-separation'.

Điều này đã giúp tôi thay đổi mã của mình và giờ tôi đã làm việc. - Cảm ơn ý kiến ​​của bạn.

Triển khai của tôi đã kết thúc giống như thế này;

tôi yêu cầu các tuyến đường của tôi trong app.js:

var express = require('express') 
    , site = require('./site') 
    , wiki = require('./wiki'); 

Và tôi thêm tuyến đường của tôi như thế này:

app.get('/', site.index); 
app.get('/wiki/:id', wiki.show); 
app.get('/wiki/:id/edit', wiki.edit); 

Tôi có hai tập tin gọi là wiki.js và site.js trong gốc của ứng dụng của tôi, chứa nội dung này:

exports.edit = function(req, res) { 

    var wiki_entry = req.params.id; 

    res.render('wiki/edit', { 
     title: 'Editing Wiki', 
     wiki: wiki_entry 
    }) 
} 
+3

Express là tuyệt vời. Là một người mới bắt đầu, nó cũng hữu ích để xây dựng một máy chủ web từ mặt đất lên một lần để hiểu nút. Tôi tìm thấy một hướng dẫn ở đây mà tôi đã đi qua sau đó đã đi thẳng để thể hiện: http://nodebeginner.org/ – bryanmac

4

Bạn cũng có thể sắp xếp chúng thành các mô-đun. Vì vậy, nó sẽ là một cái gì đó như thế.

./ 
controllers 
    index.js 
    indexController.js 
app.js 

và sau đó trong chỉ mụcController.js của bộ điều khiển xuất bộ điều khiển của bạn.

//indexController.js 
module.exports = function(){ 
//do some set up 

var self = { 
    indexAction : function (req,res){ 
     //do your thing 
} 
return self; 
}; 

sau đó trong index.js của bộ điều khiển dir

exports.indexController = require("./indexController"); 

và cuối cùng trong app.js

var controllers = require("./controllers"); 

app.get("/",controllers.indexController().indexAction); 

Tôi nghĩ rằng cách tiếp cận này cho phép tách rõ ràng hơn và bạn cũng có thể cấu hình của bạn bộ điều khiển bằng cách truyền có lẽ là kết nối db.

5

Dường như chỉ index.js được tải khi bạn yêu cầu ("./ routes"). tôi đã sử dụng đoạn mã sau vào index.js để tải phần còn lại của các tuyến đường:

var fs = require('fs') 
    , path = require('path'); 

fs.readdirSync(__dirname).forEach(function(file){ 
    var route_fname = __dirname + '/' + file; 
    var route_name = path.basename(route_fname, '.js'); 
    if(route_name !== 'index' && route_name[0] !== "."){ 
    exports[route_name] = require(route_fname)[route_name]; 
    } 
}); 
+0

Đây là một cách tốt đẹp để tránh có một tấn 'require' báo cáo nếu bạn không nhóm các tuyến đường của bạn bằng cách sắp xếp của không gian tên. – ZachB

+0

Trên thực tế, thay đổi dòng cuối cùng thành 'xuất [route_name] = require (route_fname)' làm cho nó để bạn có thể tham khảo các tuyến đường bằng không gian tên, ví dụ: 'routes.users.show'. – ZachB

9

Các route-map ví dụ rõ ràng phù hợp với đường dẫn url với các đối tượng do đó phù hợp với động từ http với các chức năng. Điều này đặt định tuyến ra trong một cây, đó là súc tích và dễ đọc. Các thực thể của ứng dụng cũng được viết dưới dạng đối tượng với các hàm như các phương thức kèm theo.

var express = require('../../lib/express') 
    , verbose = process.env.NODE_ENV != 'test' 
    , app = module.exports = express(); 

app.map = function(a, route){ 
    route = route || ''; 
    for (var key in a) { 
    switch (typeof a[key]) { 
     // { '/path': { ... }} 
     case 'object': 
     app.map(a[key], route + key); 
     break; 
     // get: function(){ ... } 
     case 'function': 
     if (verbose) console.log('%s %s', key, route); 
     app[key](route, a[key]); 
     break; 
    } 
    } 
}; 

var users = { 
    list: function(req, res){ 
    res.send('user list'); 
    }, 

    get: function(req, res){ 
    res.send('user ' + req.params.uid); 
    }, 

    del: function(req, res){ 
    res.send('delete users'); 
    } 
}; 

var pets = { 
    list: function(req, res){ 
    res.send('user ' + req.params.uid + '\'s pets'); 
    }, 

    del: function(req, res){ 
    res.send('delete ' + req.params.uid + '\'s pet ' + req.params.pid); 
    } 
}; 

app.map({ 
    '/users': { 
    get: users.list, 
    del: users.del, 
    '/:uid': { 
     get: users.get, 
     '/pets': { 
     get: pets.list, 
     '/:pid': { 
      del: pets.del 
     } 
     } 
    } 
    } 
}); 

app.listen(3000); 
Các vấn đề liên quan