Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Express js中使用路由_Node.js_Url Routing_Express - Fatal编程技术网

Node.js 在Express js中使用路由

Node.js 在Express js中使用路由,node.js,url-routing,express,Node.js,Url Routing,Express,所以我开始使用Node.js。我在电视上看到了Ryan Dahl的视频,听说他为网站推荐了Express js 我下载了最新版本的Express,并开始编写代码。我在/上有一个完全成熟的静态视图,但一旦我尝试发送参数,就会出现如下错误: Cannot GET /wiki exports.index = function(req, res) { res.render('index', { title: 'Test', articles: articles, current_article

所以我开始使用Node.js。我在电视上看到了Ryan Dahl的视频,听说他为网站推荐了Express js

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

Cannot GET /wiki
exports.index = function(req, res) {
    res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections })
};
app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);
我试着跟着指南走,但在最新版本中,人们使用路线的方式发生了变化,这使得指南无法使用

指南:

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

app.get('/', routes.index);
当我尝试添加另一条路线时,问题就出现了

app.get('/wiki', routes.wiki_show);
我已经尝试了很多方法,但我一直遇到
无法获取/wiki
(404)错误

routes/index.js如下所示:

Cannot GET /wiki
exports.index = function(req, res) {
    res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections })
};
app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);
我在那里做的唯一一件事就是添加一些参数(在同一个文件中的数组),我正在工作。但是,当我复制内容并将
exports.index
更改为
exports.wiki
exports.wiki\u show
时,仍然会出现
无法获取/wiki
错误


谁能给我解释一下我在这里遗漏了什么谢谢。

所以,在我创建了我的问题之后,我在右边得到了一个类似问题的相关列表:

那篇文章中的答案链接到了,建议看一下“”示例

这帮助我改变了我的代码,我现在让它工作了谢谢你的评论

我的实现结果是这样的

我在app.js中需要我的路线:

var express = require('express')
  , site = require('./site')
  , wiki = require('./wiki');
我添加的路线如下:

Cannot GET /wiki
exports.index = function(req, res) {
    res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections })
};
app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);
我的应用程序根目录中有两个名为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
    })
}

您还可以将它们组织成模块。所以它会是这样的

./
controllers
    index.js
    indexController.js
app.js
然后在控制器的indexController.js中导出控制器

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

var self = {
     indexAction : function (req,res){
       //do your thing
}
return self;
};
然后在控制器目录的index.js中

exports.indexController = require("./indexController");
最后是在app.js中

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

app.get("/",controllers.indexController().indexAction);
我认为这种方法允许更清晰的分离,而且您还可以通过传入db连接来配置控制器。

似乎只有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];
  }
});
express示例将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);
任何人都不应该继续编写app.use(“/someRoute”,require('someFile'),直到它形成一堆代码。 花时间调用/定义路由根本没有意义。即使您确实需要自定义控件,也可能只是在一段时间内,并且在大多数情况下,您希望能够创建路由的标准文件结构,并让模块自动执行

试一试

当您扩展应用程序时,路由调用将开始形成一大堆无用的代码。您只需执行两行代码即可处理所有
应用程序。请将
路由调用与Route Magic一起使用,如下所示:

Cannot GET /wiki
exports.index = function(req, res) {
    res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections })
};
app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);
const magic=require('express-routemagic'))
使用(应用程序,_udirname,“[您的路线目录]”)

对于那些您想手动处理的,不要使用将目录传递给Magic。

您添加了路由器中间件吗?您下载了最新的Express?你是从github还是通过NPM得到的?@DeaDEnD是的,我很确定:)@RyanOlds我是从github得到的:)Master不稳定。使用NPM安装它,您应该得到2.5.6。此外,当您指定路由时,路由器中间件会自动绑定。Express非常棒。作为初学者,从头开始构建一个web服务器来理解节点也是很有用的。我在这里找到了一个教程,我读了这个教程,然后直截了当地说:这是一个很好的方法,可以避免在没有按名称空间对路由进行分组的情况下出现大量的
require
语句。实际上,将~last line改为
exports[route\u name]=require(route\u fname)
使之成为以后可以通过名称空间引用路由,例如
routes.users.show