www.91084.com

GVKun编程网logo

是否可以在Express.js中命名路由(express js)

10

如果您想了解是否可以在Express.js中命名路由的相关知识,那么本文是一篇不可错过的文章,我们将对expressjs进行全面详尽的解释,并且为您提供关于CSS在Express中的动态路由中不起作用

如果您想了解是否可以在Express.js中命名路由的相关知识,那么本文是一篇不可错过的文章,我们将对express js进行全面详尽的解释,并且为您提供关于CSS在Express中的动态路由中不起作用、javascript – 在Express和Node.js中,是否可以扩展或覆盖响应对象的方法?、Node.js express 创建路由对象挂载路由 express 配置、使用 Session、node.js – 使用Express.js的动态路由 – 这是否可能?的有价值的信息。

本文目录一览:

是否可以在Express.js中命名路由(express js)

是否可以在Express.js中命名路由(express js)

基本路线是这样的:

app.get(''/'', function(req, res){  res.send(''hello world'');});

是否可以命名该路由并在任何模板中使用它,以便可以像这样使用它:

app.get(''/'', name="index", function(req, res){  res.send(''hello world'');});Go to site <a href="{% url index %}">index page</a>.

灵感来自Django :)

答案1

小编典典

没有开箱即用的机制。但是,您可以模仿Django的样式:定义urls.js文件,该文件将包含URL数组。首先开始:

myviews.js

exports.Index = function( req, res, next ) {    res.send( "hello world!" );};

urls.js

var MyViews = require( "mywviews.js" );module.exports = [    { name : "index", pattern : "/", view : MyViews.Index }]

现在在 app.js (或任何主文件)中,您需要将URL绑定到Express。例如这样:

app.js

var urls = require( "urls.js" );for ( var i = 0, l = urls.length; i < l; i++ ) {    var url = urls[ i ];    app.all( url.pattern, url.view );};

现在,您可以定义自定义帮助程序(Express 3.0样式):

var urls = require( "urls.js" ), l = urls.length;app.locals.url = function( name ) {    for ( var i = 0; i < l; i++ ) {        var url = urls[ i ];        if ( url.name === name ) {            return url.pattern;        }    };};

您可以轻松地在模板中使用它。现在的问题是,它没有像Django(您可以在其中传递其他参数url)那样为您提供精美的URL创建机制。另一方面,您可以修改url功能并对其进行扩展。我不想在这里讨论所有细节,但是这是一个如何使用正则表达式的示例(您应该能够将它们与思想结合在一起)
请注意,我发布了问题,所以前段时间我遇到了同样的问题。:D

CSS在Express中的动态路由中不起作用

CSS在Express中的动态路由中不起作用

如何解决CSS在Express中的动态路由中不起作用?

我正在做快递。

当我尝试使用动态路由时,CSS文件未正确导入。

路由器代码和ejs文件代码在下面添加。

router.get(''products-list/:productId'',quoteController.getQuote);
<!DOCTYPE html>
<html lang="en">
<head>
  <Meta charset="utf-8">
  <title> <%= pageTitle %> </title>
  <Meta content="width=device-width,initial-scale=1.0" name="viewport">
  <Meta content="" name="keywords">
  <Meta content="" name="description">
  
  <!-- Bootstrap CSS File -->
  <link href="css/bootstrap.css" rel="stylesheet">
  <!-- Main Stylesheet File -->
  <link href="css/style.css" rel="stylesheet">
      </head>
      
      <body id="page-top">
      <% if (products.length > 0 ) { %> 
        <% for(let product of products) { %> 
        <div id="home">
          <div></div>
                <a href="products-list/<%= product._id%>"> <%= product.quote %> </a>
                <br>
                <a href="products-list/<%= product._id%>"> <%= product.source %> </a>
              </div>
              <a href="products-list/<%= product._id%>">Details</a>
      <% } %> 
    <% } %> 
      </body>
    <%- include(''../includes/end.ejs'') %>

上面的代码无法正确导入CSS文件。没有错误,只是缺少CSS文件。

但是当我更改如下所示的URL时,会正确导入CSS文件。

我使用了app.use(express.static(path.join(__ dirname,''public'')));用于公共文件,而我的CSS文件位于“公共”文件夹中。

router.get(''/:productId'',initial-scale=1.0" name="viewport">
  <Meta content="" name="keywords">
  <Meta content="" name="description">
  
  <!-- Bootstrap CSS File -->
  <link href="css/bootstrap.css" rel="stylesheet">
  <!-- Main Stylesheet File -->
  <link href="css/style.css" rel="stylesheet">
      </head>
      
      <body id="page-top">
      <% if (products.length > 0 ) { %> 
        <% for(let product of products) { %> 
        <div id="home">
          <div></div>
                <a href="/<%= product._id%>"> <%= product.quote %> </a>
                <br>
                <a href="/<%= product._id%>"> <%= product.source %> </a>
              </div>
              <a href="/<%= product._id%>">Details</a>
      <% } %> 
    <% } %> 
      </body>
    <%- include(''../includes/end.ejs'') %>

出什么问题了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

javascript – 在Express和Node.js中,是否可以扩展或覆盖响应对象的方法?

javascript – 在Express和Node.js中,是否可以扩展或覆盖响应对象的方法?

对于每个中间件,Express都会传递res和req对象.这些对象分别扩展了来自http.ServerResponse和http.ClientRequest的本机对象.我想知道是否可以覆盖或扩展响应对象的方法.

例如,我不想使用res.render(‘home’,jsonData);而是使用名为customrender的自定义方法扩展res,并使用它:res.customrender().

我没有陷入某个特定问题或其他任何问题.我只是想学习如何扩展本机对象,或者像本例一样,来自Node.js中第三方模块的对象

解决方法:

最好的想法是将自定义方法添加到响应对象的原型:

var express = require("express");

express.response.customrender = function() {
    // your stuff goes here
};

并且每个res对象都应该可以访问此函数.

您可以阅读源代码以了解它们如何扩展本机对象.基本上他们正在做原型链接:

快递/ lib目录/ response.js

var res = module.exports = {
  __proto__: http.ServerResponse.prototype
};

这个对象成为newely创建的响应对象(来自连接框架)的原型:

res.__proto__ = app.response;

(app.response只是上面定义的res的别名).请注意,__ proto__属性是对对象原型的引用.

但请注意.首先__proto__不是EcmaScript的一部分(它可能在其他JavaScript实现中不可用).其次:通常你会使用Object.create进行继承(直接在一个对象上设置__proto__是一个猴子修补,这通常是一个不好的做法,它可能会破坏很多东西).在这里阅读更多相关信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

总结

以上是小编为你收集整理的javascript – 在Express和Node.js中,是否可以扩展或覆盖响应对象的方法?全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://codeday.me/bug/20191007/1866398.html

Node.js express 创建路由对象挂载路由 express 配置、使用 Session

Node.js express 创建路由对象挂载路由 express 配置、使用 Session

6.5. express 创建路由对象挂载路由

  • 创建路由对象

    // 引入包
    var ewpress = require(''express'')
    // 创建一个新的路由对象,options 指定路由器的行为
    var router = express.Router([options])
    

    注意: 可以将中间件和HTTP方法路由(如get、put、post等)添加到路由器(相当于一个容器,可添加多个 HTTP 方法)

  • 挂载路由

    // 引入路由文件
    var router = require(''./router'')
    // 配置
    ...
    // 将路由挂载到 app 服务上
    var app.use(''router'')
    

6.6. express 配置、使用 Session

  • 安装第三方包

    npm install express-session
    
  • 引包

    var session = require(''express-session'')
    
  • 配置(在挂载路由之前)

    app.use(session({
      // 配置加密字符串,在原来的加密基础上和该字符串拼在一起去加密(增强安全性)
      secret: ''keyboard cat'',
      resave: false,
      // 值为 true 时,无论用户是否使用 session 都会创建一个
      // 值为 false 时,只有向 session 中存数据时才会创建
      saveUninitialized: true,
      cookie: { secure: true }
    }))
    
  • 使用

    // 通过赋值的方式添加数据
    req.session.userName = ''Jack''
    // 获取数据
    req.session.userName
    
  • 清除 session

    req.session.userName = null
    

    注意: Session 数据默认是内存存储的,服务器一旦重启就会丢失。

总结

以上是小编为你收集整理的Node.js express 创建路由对象挂载路由 express 配置、使用 Session全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://blog.csdn.net/weixin_44486539/article/details/96622351

node.js – 使用Express.js的动态路由 – 这是否可能?

node.js – 使用Express.js的动态路由 – 这是否可能?

每次我用新的菜单项更新数据库时,我都试图让路由更新一个路由.这是我悲伤的小丑陋的尝试:

在app.js中,我检查菜单数据库和shazaam …路由是在启动时动态制作的.凉!:

// in app.js //
var attachDB = function(req,res,next) {
    req.contentdb = db.content;
    req.menudb = db.menu;
    req.app = app;  // this is the express() app itself
    req.page = PageController;
    next();
};
db.menu.find({},function (err,menuitems){ 
    for(var i=0; record = menuitems[i]; i++) {
        var menuitem = record.menuitem;
        app.all('/' + menuitem,attachDB,function(req,next) {
            console.log('req from app all route: ',req)
            PageController.run(menuitem,req,next);
        }); 
    }

    http.createServer(app).listen(config.port,function() {
        console.log(
            '\nExpress server listening on port ' + config.port
        );
    });
});

不是真正的优雅,但它是一个概念的证明.现在问题出现了:当我在Admin.js文件中保存一个新的菜单项时,数据库得到了更新,路由器似乎得到了更新,但点击带有动态创建路径的菜单链接后,请求就会爆炸

请求中的许多内容似乎都缺失了,我觉得有些基本的东西我不了解路由,回调或者这可能只是错误的解决方案.以下是负责创建新菜单项并在Admin.js文件中创建新路径的函数如下所示:

// in Admin.js //
menuItem: function(req,callback) {
    var returnMenuForm = function() {
        res.render('admin-menuitem',{},function(err,html) {
            callback(html);
        });
    };
    var reqMenudb = req.menudb,reqContentdb = req.contentdb,reqApp = req.app,reqPage = req.page;

    if(req.body && req.body.menuitemsubmitted && req.body.menuitemsubmitted === 'yes') {
        var data = { menuitem: req.body.menuitem };
        menuModel.insert( data,function(err) {
            if (err) {
                console.log('Whoa there...',err.message);
                returnMenuForm();
            } else {
                // data is inserted....great. PROBLEM...the routes have not been updated!!!  Attempt that mimics what I do in app.js here...
                reqApp.all('/' + data.menuitem,next) {
                     // the 2 db references below are set with the right values here
                    req.contentdb = reqContentdb;
                    req.menudb = reqMenudb;
                    next();
                },next) {
                    reqPage.run(data.menuitem,next);
                });

                returnMenuForm();
            }
        });
    } else {
        returnMenuForm();
    }
},

保存管理部分中的数据工作正常.如果您控制日志app.routes,它甚至会显示一条非常酷的新路线.但是,刷新页面并单击新路径应该工作的链接后,我收到一个未定义的错误.

管理员将数据传递给我的页面控制器:

// in PageController.js //
module.exports = BaseController.extend({ 
    name: "Page",content: null,run: function(type,next) {
        model.setDB(req.contentdb);  /* <-- problem here,req.contentdb is undefined which causes me problems when talking to the Page model */
        var self = this;
        this.getContent(type,function() {
            var v = new View(res,'inner');
            self.navMenu(req,function(navMenuMarkup){
                self.content.menunav = navMenuMarkup;
                v.render(self.content);
            });
        });
    },getContent: function(type,callback) {
        var self = this;
        this.content = {}
        model.getlist(function(records) {
            if(records.length > 0) {
                self.content = records[0];
            }
            callback();
        },{ type: type });
    }

最后,错误点在模型中

// in Model.js //
module.exports = function() {

    return {
        setDB: function(db) {
            this.db = db;
        },getlist: function(callback,query) {
            this.db.find(query || {},doc) { callback(doc) });
        },

最后,上面的getlist方法中的’this’是未定义的,导致页面爆炸.

如果我重新启动服务器,由于app.js中的动态加载程序,一切都会再次运行但是,在更新数据库后,是否有某种方法可以重新加载路由?我的技术不起作用,将主应用程序传递给控制器​​是很难看的,就像我在这里做的那样.

解决方法

我建议两个改变:

>将此菜单附件移动到单独的模块.
>当你在这里时,做一些缓存.

概念菜单db函数的证明,与setTimeout异步,你将用actuall db调用替换它.

// menuitems is cached here in this module. You can make an initial load from db instead.
var menuitems = [];
// getting them is simple,always just get the current array. We'll use that.
var getMenuItems = function() {
    return menuitems;
}

// this executes when we have already inserted - calls the callback
var addMenuItemHandler = function(newItem,callback) {
    // validate that it's not empty or that it does not match any of the existing ones
    menuitems.push(newItem);
    // remember,push item to local array only after it's added to db without errors
    callback();
}
// this one accepts a request to add a new menuitem
var addMenuItem = function(req,res) {
    var newItem = req.query.newitem;

    // it will do db insert,or setTimeout in my case
    setTimeout(function(newItem){
        // we also close our request in a callback
        addMenuItemHandler(newItem,function(){
            res.end('Added.');
        });

    },2000);
};

module.exports = {
    addMenuItem: addMenuItem,getMenuItems: getMenuItems
}

所以现在你有一个模块menuhandler.js.让我们构建它并在我们的应用程序中使用它.

var menuHandler = require('./menuhandler');
var app = express();
// config,insert middleware etc here

// first,capture your static routes - the ones before the dynamic ones.
app.get('/addmenuitem',menuHandler.addMenuItem);
app.get('/someotherstaticroute',res) {
    var menu = menuHandler.getMenuItems();
    res.render('someview',{menu: menu});
});


// Now capture everything in your menus.
app.get('/:routename',res){
    // get current items and check if requested route is in there.

    var menuitems = menuHandler.getMenuItems();
    if(menuitems.indexOf(req.params.routename) !== -1) {
        res.render('myview',{menu: menuitems});
    } else {
        // if we missed the route,render some default page or whatever.
    }
});

app.get('/',res) {
    // ...
});

现在你没有去过db,如果没有新的更新(因为menuitems数组总是最新的),所以你的初始视图渲染速度更快(无论如何,对于那个1分贝的调用).

编辑:哦,我刚看到你的Model.js.问题在于,这是指您返回的对象:

{
    setDB: function(db) {
        this.db = db;
    },query) {
        this.db.find(query || {},doc) { callback(doc) });
    }
}

所以,默认情况下没有数据库.而且,由于您在初始页面加载中将某些内容附加到应用程序,因此您可以获得一些东西

但是在你当前的更新功能中,你将东西附加到新的应用程序(reqApp = req.app),所以现在你不是在谈论原始应用程序,而是另一个实例.而且我认为您的后续请求(更新后)使得范围全部混淆,因此失去了与实际最新数据的联系.

今天关于是否可以在Express.js中命名路由express js的讲解已经结束,谢谢您的阅读,如果想了解更多关于CSS在Express中的动态路由中不起作用、javascript – 在Express和Node.js中,是否可以扩展或覆盖响应对象的方法?、Node.js express 创建路由对象挂载路由 express 配置、使用 Session、node.js – 使用Express.js的动态路由 – 这是否可能?的相关知识,请在本站搜索。

本文标签: