在Express-js中使用路由

And*_*olm 45 url-routing node.js express

所以我开始使用Node.js. 我在Nodejs.org看过 Ryan Dahl的视频,并听说他为网站推荐了Express-js.

我下载了最新版本的Express,并开始编写代码.我在/上有一个完全成熟的静态视图,但是一旦我尝试发送参数,我就会遇到这样的错误:

Cannot GET /wiki
Run Code Online (Sandbox Code Playgroud)

我尝试按照expressjs.com上的指南进行操作,但是在最新版本中使用路由的方式已经改变,这使得指南无法使用.

指南:

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

由Express生成:

app.get('/', routes.index);
Run Code Online (Sandbox Code Playgroud)

当我尝试添加另一条路线时,我的问题就出现了.

app.get('/wiki', routes.wiki_show);
Run Code Online (Sandbox Code Playgroud)

我尝试了很多方法,但我一直得到Cannot GET /wiki(404)错误.

routes/index.js看起来像这样:

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

我在那里做的唯一事情是添加一些参数(同一文件中的数组),这我工作.但是,当我复制内容并更改exports.indexexports.wikiexports.wiki_show仍然得到Cannot GET /wiki错误.

任何人都可以向我解释我在这里缺少什么吗?- 谢谢.

And*_*olm 75

所以,在我创建了我的问题之后,我在右边得到了这个相关的列表,类似的问题是:在Node.js中组织路由.

该帖子中的答案与GitHub上Express repo相关联,并建议查看" 路由分离 "示例.

这有助于我改变我的代码,现在我已经开始工作了.- 感谢您的意见.

我的实现最终看起来像这样;

我需要app.js中的路线:

var express = require('express')
  , site = require('./site')
  , wiki = require('./wiki');
Run Code Online (Sandbox Code Playgroud)

我添加这样的路线:

app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序的根目录中有两个名为wiki.js和site.js的文件,其中包含:

exports.edit = function(req, res) {

    var wiki_entry = req.params.id;

    res.render('wiki/edit', {
        title: 'Editing Wiki',
        wiki: wiki_entry
    })
}
Run Code Online (Sandbox Code Playgroud)

  • 快递很棒.作为初学者,从头开始构建Web服务器以理解节点也很有用.我在这里找到了一个教程,然后我直接进行了表达:http://nodebeginner.org/ (3认同)

sys*_*ich 10

路由映射快车例如URL路径匹配处理对象这反过来HTTP动作与功能相匹配.这将路由放在树中,这是简洁易读的.应用程序的实体也被编写为具有封闭方法功能的对象.

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);
Run Code Online (Sandbox Code Playgroud)


Shl*_*ton 5

似乎只在需要时加载index.js("./ routes").我在index.js中使用了以下代码来加载其余的路由:

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];
  }
});
Run Code Online (Sandbox Code Playgroud)