天道酬勤,学无止境

如何将变量从app.js传递到route / index.js?(How to pass variable from app.js to routes/index.js?)

问题

我正在使用收缩路线https://npmjs.org/package/shrinkroute在nodejs中建立链接。 我收到错误500 ReferenceError:收缩器未定义

如何将rinkeroute传递给routes / index.js? 有没有更好的方法通过传递查询字符串args创建url?

//app.js
var app = express();

var shrinkr = shrinkroute( app, {
    "user": {
        path: "/user/:id?",
        get: routes.showOrListUsers
    }
});
//url method works in app.js    
var url = shrinkr.url( "user", { id: 5, page:40, type:'a' } );
console.log(url);

app.use( shrinkr.middleware );

//routes/index.js
exports.showOrListUsers = function(req, res, next) {                       
    console.log(req.params); 
    //shrinkr errors out in index.js                                      
    var url2 = shrinkr.url( "users", {name: "foo"});                       
    console.log(url2);                                                                         
}      
回答1

一种解决方案是使用app.set将shrinkr存储在您的应用程序对象中:

// app.js
...
app.set('shrinkr', shrinkr);
...

routes/index.js ,您可以通过req.appres.app对象访问它:

exports.showOrListUsers = function(req, res, next) {
  var shrinkr = req.app.get('shrinkr');
  ...
};
回答2

晚了一点,但以下方法也可以:

app.js

var my_var = 'your variable';

var route = require('./routes/index')(my_var);
app.get('/', route);

同时在route.js中

var express = require('express')
,   router = express.Router()

// Router functions here, as normal; each of these
// run only on requests to the server

router.get('/', function (req, res, next) {
    res.status(200).end('Howdy');
});


module.exports = function(my_var){

    // do as you wish
    // this runs in background, not on each
    // request

    return router;
}
回答3

实现所需目标的两种简单方法:

1.从您的路线中访问您的rinkeroute实例

就那么简单。 设置Shrinkroute之后,无需执行其他操作。

exports.showOrListUsers = function(req, res, next) {
  var shrinkr = req.app.shrinkroute;
  console.log( "Route: " + req.route.name ); // ta-da, made available by Shrinkroute
  // do your URL buildings
};

2.使用中间件

如果您不想使用Shrinkroute的非URL构建方法,可以使用中间件,该中间件将为您的路线和模板提供一些帮助(通过本地人):

// app.js
app.use( shrinkr.middleware );

// routes/index.js
exports.showOrListUsers = function(req, res, next) {
  console.log( "Route: " + req.route.name ); // ta-da, made available by Shrinkroute

  req.buildUrl( "users", { name: "foo" } );
  // or, if you want the full url with the scheme and host...
  req.buildFullUrl( "users", { name: "foo" } );
};

也许您也想在模板中使用它们?

// templates/index.jade
a( href=url( "users", { name: "foo" } ) ) Foo profile
a( href=fullUrl( "users", { name: "foo" } ) ) Foo profile

此方法的优点是您无法直接访问路径内的路径设置器。


免责声明:我是Shrinkroute的作者。

回答4

您应该导入它。 在代码的开头添加以下行

  var shrinkroute = require('shrinkroute');

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何将变量从玉模板文件传递到脚本文件?(How to pass variable from jade template file to a script file?)
    问题 我在未传递到javascript文件的玉模板文件(index.jade)中声明的变量(config)遇到问题,这使我的javascript崩溃了。 这是文件(views / index.jade): h1 #{title} script(src='./socket.io/socket.io.js') script(type='text/javascript') var config = {}; config.address = '#{address}'; config.port = '#{port}'; script(src='./javascripts/app.js') 这是我的app.js(服务器端)的一部分: app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); app.configure('development', function(){ app.set('address', 'localhost'); app.use(express.errorHandler({ dumpExceptions: true, showStack: true }))
  • Express:如何将应用程序实例传递到来自其他文件的路由?(Express: How to pass app-instance to routes from a different file?)
    问题 我想将路由分为不同的文件,其中一个文件包含所有路由,另一个文件包含相应的操作。 我目前有一个解决方案来实现此目的,但是我需要使应用程序实例成为全局实例,以便能够在操作中对其进行访问。 我当前的设置如下所示: app.js: var express = require('express'); var app = express.createServer(); var routes = require('./routes'); var controllers = require('./controllers'); routes.setup(app, controllers); app.listen(3000, function() { console.log('Application is listening on port 3000'); }); route.js: exports.setup = function(app, controllers) { app.get('/', controllers.index); app.get('/posts', controllers.posts.index); app.get('/posts/:post', controllers.posts.show); // etc. }; 控制器/ index.js: exports
  • 如何在EJS视图中使用节点模块(例如MomentJS)?(How to use node modules (like MomentJS) in EJS views?)
    问题 要在views / custom.ejs中使用MomentJS,正确的方法是什么(如果有)? 服务器端路线/索引等,我们可以轻松地使用require('moment'); 等,它工作正常。 服务器端(EJS视图) views / custome.ejs,类似<% var m = require('moment'); %> <% var m = require('moment'); %>不起作用 我正在使用ExpressJS和EJS作为模板引擎。 回答1 我找到了另一种方法,我认为它有一些优点。 不要污染您的代码导出过滤器。 无需导出所有方法即可访问任何方法。 更好的ejs使用率(无|管道)。 在您的控制器或view.js上执行以下操作: var moment = require('moment'); exports.index = function(req, res) { // send moment to your ejs res.render('index', { moment: moment }); } 现在,您可以在ejs中使用moment: <html> <h1><%= moment().fromNow() %></h1> </html> 我不是Node专家,所以如果有人在执行此操作时遇到问题,请告诉我! :) 回答2 另一种选择: 这样
  • 如何在Express中的多个文件中包括路由处理程序? [复制](How to include route handlers in multiple files in Express? [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Node.js和Express 4上分开路由? (8个答案) 7天前关闭。 在我的NodeJS express应用程序中,我有一些通用路线的app.js 然后在wf.js文件中,我想定义更多路线。 如何获取app.js来识别wf.js文件中定义的其他路由处理程序? 一个简单的要求似乎不起作用。 回答1 如果要将路由放置在单独的文件中(例如, routes.js ,则可以通过以下方式创建routes.js文件: module.exports = function(app){ app.get('/login', function(req, res){ res.render('login', { title: 'Express Login' }); }); //other routes.. } 然后你就可以从需要它app.js传递app对象是这样的: require('./routes')(app); 看一下这些示例:https://github.com/visionmedia/express/tree/master/examples/route-separation 回答2 在Express 4.x中,您可以获取路由器对象的实例,并导入另一个包含更多路由的文件。 您甚至可以递归执行此操作,以便您的路由导入其他路由
  • ExpressJS如何构建应用程序?(ExpressJS How to structure an application?)
    问题 我正在使用NodeJS的ExpressJS Web框架。 使用ExpressJS的人将他们的环境(开发,生产,测试...),路线等放置在app.js 。 我认为这不是一个好方法,因为当您拥有大型应用程序时,app.js太大了! 我想要这样的目录结构: | my-application | -- app.js | -- config/ | -- environment.js | -- routes.js 这是我的代码: app.js var express = require('express'); var app = module.exports = express.createServer(); require('./config/environment.js')(app, express); require('./config/routes.js')(app); app.listen(3000); config / environment.js module.exports = function(app, express){ app.configure(function() { app.use(express.logger()); }); app.configure('development', function() { app.use(express
  • 将变量从Flask传递到JavaScript(Passing variables from Flask to JavaScript)
    问题 我看过类似的论坛,但无法获得任何有效的解决方案。 我试图将变量从Flask传递到我的JavaScript文件。 这些值将用于我的JavaScript文件中的PubNub。 这是我的Python代码的一部分: @app.route("/mysettings/") def user_settings(): return render_template('Settings.html', project_name = session['project_name'] , publish_key = session['publish_key'] , subscribe_key = session['subscribe_key'] ) 这是我的JavaScript代码(app.js)的一部分: var settings = { channel: {{project_name}}, publish_key: {{publish_key}}, subscribe_key: {{subscribe_key}} }; 如果我在Settings.html文件中使用了此代码,而在app.js文件中却没有使用,则此代码有效。 回答1 mobiusklein的答案相当不错,但是您应该考虑“ hack”。 定义Javascript方法以接收参数并将数据作为参数发送给函数。 main.py @app
  • Node.js中的module.exports与export(module.exports vs exports in Node.js)
    问题 我在Node.js模块中找到了以下合同: module.exports = exports = nano = function database_module(cfg) {...} 我不知道什么之间的不同module.exports和exports ,为什么都被用在这里。 回答1 设置module.exports允许在required时像调用函数一样调用database_module函数。 简单设置exports将不允许导出函数,因为节点将导出对象module.exports 。 以下代码不允许用户调用该函数。 module.js 以下内容无效。 exports = nano = function database_module(cfg) {return;} 如果设置了module.exports则以下内容将起作用。 module.exports = exports = nano = function database_module(cfg) {return;} 安慰 var func = require('./module.js'); // the following line will **work** with module.exports func(); 基本上, node.js不会导出exports当前引用的对象,而是导出exports最初引用的对象的属性。
  • 将公共变量传递到Node.js中单独的模块中的最佳方法是什么?(What is the best way to pass common variables into separate modules in Node.js?)
    问题 我将单独的路由器文件用作主应用程序和身份验证应用程序的模块。 我无法获得将变量(数据库客户端)传递到路由器的最佳方法。 我不想对其进行硬编码或将其传递给: module.exports = function(app, db) { 也许是使用单例寄存器或使用全局db变量的最佳方法? 您对设计模式有什么经验? 哪种方法是最好的,为什么? 回答1 我发现使用依赖注入来传递东西是最好的样式。 确实看起来像您拥有的东西: // App.js module.exports = function App() { }; // Database.js module.exports = function Database(configuration) { }; // Routes.js module.exports = function Routes(app, database) { }; // server.js: composition root var App = require("./App"); var Database = require("./Database"); var Routes = require("./Routes"); var dbConfig = require("./dbconfig.json"); var app = new App(); var
  • vue-bilibili学习笔记
    1.vue基础 VUE调试工具 vue调试工具步骤: 1.远程克隆仓库 2.安装依赖包 3.构建 4.打开谷歌页面 5.选中开发者模式 6.加载已解压的扩展,选择shells/chrome 1.组件间数据及交互 数据交互原则: 单向数据流 父组件的数据传递给子组件, 只要父组件的数据变化了,自动重新向下流动, 进而子组件会进行更新数据 所以父组件的数据应该交给父组件修改 数据来源 data: 自己的数据可以随便更改 props: 传进来的数据不允许更改, 或者不建议更改 : 防止多个子组件进行数据交错 父传子传递复杂数据类型的说明 ​ 修改简单数据类型会报错 ​ 修改复杂数据类型,修改地址报错, 如果不改地址,修改对象的属性,不会报错,但是不符合单项数据流 ​ 通过 e v e n t 设 置 event设置 event设置 事件对象 进行设置 如果是简单数据类型, 子组件修改了,vue能检测到 如果是复杂数据类型, 子组件修改父组件出过来的值,不会报错 , 解决办法 : 表单双向数据绑定 解决办法一 : 不能用v-model进行与数据绑定 用 : checked = 'item.flag' 进行数据绑定 通过事件对象$event 事件对象 进行传递, 同时在函数中 function (e){e.target.checked} 同伙 解决办法二
  • 手动刷新或编写时,React-router网址不起作用(React-router urls don't work when refreshing or writing manually)
    问题 我正在使用React-router,当我单击链接按钮时,它可以正常工作,但是当我刷新网页时,它不会加载我想要的内容。 例如,我在localhost/joblist ,一切都很好,因为我按链接到达此处。 但是,如果刷新网页,则会得到: Cannot GET /joblist 默认情况下,它不是这样工作的。 最初,我的URL为localhost/#/和localhost/#/joblist ,它们工作得很好。 但我不喜欢这种URL,因此尝试删除# ,我写道: Router.run(routes, Router.HistoryLocation, function (Handler) { React.render(<Handler/>, document.body); }); localhost/不会发生此问题,这总是返回我想要的。 编辑:这个程序是单页的,所以/joblist不需要向任何服务器询问任何内容。 EDIT2:我的整个路由器。 var routes = ( <Route name="app" path="/" handler={App}> <Route name="joblist" path="/joblist" handler={JobList}/> <DefaultRoute handler={Dashboard}/> <NotFoundRoute handler=
  • 如何通过Jinja2将列表从Python传递到JavaScript(How to pass a list from Python, by Jinja2 to JavaScript)
    问题 假设我有一个Python变量: list_of_items = ['1','2','3','4','5'] 然后通过呈现HTML将其传递给Jinja,并且我在JavaScript中还有一个名为somefunction(variable)的函数。 我正在尝试传递list_of_items每个项目。 我尝试过这样的事情: {% for item in list_of_items %} <span onclick="somefunction({{item}})">{{item}}</span><br> {% endfor %} 是否可以将列表从Python传递到JavaScript,还是应该逐个循环传递列表中的每个项目? 我怎样才能做到这一点? 回答1 要将某些上下文数据传递给javascript代码,您必须对其进行序列化,以使其被javascript(即JSON)“理解”。 您还需要使用safe Jinja过滤器将其标记为安全,以防止数据被html转义。 您可以通过执行以下操作来实现: 风景 import json @app.route('/') def my_view(): data = [1, 'foo'] return render_template('index.html', data=json.dumps(data)) 模板 <script type="text
  • 如何在React Router v4中推送到历史记录?(How to push to History in React Router v4?)
    问题 在当前版本的React Router(v3)中,我可以接受服务器响应并使用browserHistory.push转到相应的响应页面。 但是,这在v4中不可用,我不确定哪种适当的处理方式。 在此示例中,使用Redux,当用户提交表单时, components / app-product-form.js调用this.props.addProduct(props) 。 当服务器返回成功消息时,该用户将被带到“购物车”页面。 // actions/index.js export function addProduct(props) { return dispatch => axios.post(`${ROOT_URL}/cart`, props, config) .then(response => { dispatch({ type: types.AUTH_USER }); localStorage.setItem('token', response.data.token); browserHistory.push('/cart'); // no longer in React Router V4 }); } 如何从React Router v4的功能重定向到购物车页面? 回答1 您可以在组件外部使用history方法。 通过以下方式尝试。 首先
  • 如何在package.json中设置环境变量?(How to set environment variables from within package.json?)
    问题 如何从package.json设置一些环境变量以与命令一起使用,例如npm start ? 这是我当前在package.json : { ... "scripts": { "help": "tagove help", "start": "tagove start" } ... } 我想在启动脚本中设置环境变量(例如NODE_ENV ),同时仍然能够仅使用一个命令npm start来启动应用npm start 。 回答1 在脚本命令中设置环境变量: ... "scripts": { "start": "node app.js", "test": "NODE_ENV=test mocha --reporter spec" }, ... 然后在您的应用程序中使用process.env.NODE_ENV 。 注意:这仅适用于Mac和Linux 。 对于Windows,请参阅注释。 回答2 只需使用NPM包交叉环境即可。 超级容易。 适用于Windows,Linux和所有环境。 请注意,您没有使用&&移至下一个任务。 您只需设置环境,然后开始下一个任务。 感谢@mikekidder在此处的评论之一中提供的建议。 从文档中: { "scripts": { "build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack -
  • 如何使node.js要求绝对? (而不是亲戚)(How to make node.js require absolute? (instead of relative))
    问题 我想始终以我项目的根目录而不是相对于当前模块的目录来要求我的文件。 例如,如果您查看https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js第6行,您将看到 express = require('../../') 这真是糟糕的IMO。 想象一下,我只想将我所有的例子都更靠近根源。 那将是不可能的,因为我将不得不在每个示例中多次更新30多个示例。 对此: express = require('../') 我的解决方案是对基于root的情况有一种特殊情况:如果字符串以$开头,则它相对于项目的根文件夹。 任何帮助表示赞赏,谢谢 更新2 现在,我正在使用require.js,它允许您以一种方式进行编写,并且可以在客户端和服务器上运行。 Require.js还允许您创建自定义路径。 更新3 现在,我移至webpack + gulp,并使用Enhanced-require处理服务器端的模块。 请参阅此处的基本原理:http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/ 回答1 然后呢: var myModule = require
  • 在Node.js中,如何从其他文件中“包含”函数?(In Node.js, how do I “include” functions from my other files?)
    问题 假设我有一个名为app.js的文件。 很简单: var express = require('express'); var app = express.createServer(); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.get('/', function(req, res){ res.render('index', {locals: { title: 'NowJS + Express Example' }}); }); app.listen(8080); 如果我在“ tools.js”中有一个函数,该怎么办。 我将如何导入它们以在apps.js中使用? 或者...我应该把“工具”变成一个模块,然后需要它吗? <<似乎很难,我宁愿对tools.js文件进行基本导入。 回答1 您可以要求任何js文件,只需声明要公开的内容即可。 // tools.js // ======== module.exports = { foo: function () { // whatever }, bar: function () { // whatever } }; var zemba = function () { } 并在您的应用文件中: // app.js // ======
  • 如何将404错误重定向到ExpressJS中的页面?(How to redirect 404 errors to a page in ExpressJS?)
    问题 我不知道执行此操作的功能,有人知道吗? 回答1 我发现这个例子很有帮助: https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js 因此,实际上是这部分: // "app.router" positions our routes // above the middleware defined below, // this means that Express will attempt // to match & call routes _before_ continuing // on, at which point we assume it's a 404 because // no route has handled the request. app.use(app.router); // Since this is the last non-error-handling // middleware use()d, we assume 404, as nothing else // responded. // $ curl http://localhost:3000/notfound // $ curl http://localhost:3000/notfound -H
  • 您可以在创建时将参数传递给AngularJS控制器吗?(Can you pass parameters to an AngularJS controller on creation?)
    问题 我有一个控制器,负责与API通信以更新用户,姓名,电子邮件等的属性。每个用户都有一个'id' ,当查看个人资料页面时,该'id'从服务器传递。 我想将此值传递给AngularJS控制器,以便它知道当前用户的API入口点。 我尝试过在ng-controller传递值。 例如: function UserCtrl(id, $scope, $filter) { $scope.connection = $resource('api.com/user/' + id) 并在HTML中 <body ng-controller="UserCtrl({% id %})"> 其中{% id %}打印从服务器发送的ID。 但我得到了错误。 在创建值时将值传递到控制器的正确方法是什么? 回答1 笔记: 这个答案是旧的。 这仅仅是关于如何实现所需结果的概念证明。 但是,按照下面的一些评论,它可能不是最佳解决方案。 我没有任何文档可以支持或拒绝以下方法。 请参考下面的一些评论,以进一步讨论该主题。 原始答案: 我回答是,您绝对可以使用ng-init和简单的init函数来做到这一点。 这是在punker上的例子 的HTML <!DOCTYPE html> <html ng-app="angularjs-starter"> <head lang="en"> <script src="//ajax
  • 在传递一些上下文时如何在expressjs中重定向?(How do I redirect in expressjs while passing some context?)
    问题 我正在使用express在node.js中制作一个Web应用程序。 这是我所拥有的简化: var express = require('express'); var jade = require('jade'); var http = require("http"); var app = express(); var server = http.createServer(app); app.get('/', function(req, res) { // Prepare the context res.render('home.jade', context); }); app.post('/category', function(req, res) { // Process the data received in req.body res.redirect('/'); }); 我的问题如下: 如果我发现/category中发送的数据无效,我想将一些附加上下文传递给/页面。 我该怎么办? 重定向似乎不允许任何额外的参数。 回答1 有几种方法可以将数据传递到不同的路由。 当然,最正确的答案是查询字符串。 您需要确保值正确地是encodeURIComponent和解码URIComponent。 app.get('/category', function(req, res) {
  • React不会加载本地图像(React won't load local images)
    问题 我正在构建一个小型React应用,并且我的本地图像无法加载。 像placehold.it/200x200这样的图片会加载。 我以为这可能与服务器有关? 这是我的App.js import React, { Component } from 'react'; class App extends Component { render() { return ( <div className="home-container"> <div className="home-content"> <div className="home-text"> <h1>foo</h1> </div> <div className="home-arrow"> <p className="arrow-text"> Vzdělání </p> <img src={"/images/resto.png"} /> </div> </div> </div> ); } } export default App; index.js: import React, { Component } from 'react'; import { render } from 'react-dom'; import { Router, Route, Link } from 'react-router'; import {
  • 如何在NodeJs应用程序和模块之间正确重用与Mongodb的连接(How to properly reuse connection to Mongodb across NodeJs application and modules)
    问题 我一直在阅读,仍然对在整个NodeJs应用程序中共享同一数据库(MongoDb)连接的最佳方法感到困惑。 据我了解,应在应用启动时打开连接,并在模块之间重用。 我目前最好的方法是将server.js (开始所有内容的主文件)连接到数据库并创建传递到模块的对象变量。 连接后,模块代码将根据需要使用此变量,并且此连接保持打开状态。 例如: var MongoClient = require('mongodb').MongoClient; var mongo = {}; // this is passed to modules and code MongoClient.connect("mongodb://localhost:27017/marankings", function(err, db) { if (!err) { console.log("We are connected"); // these tables will be passed to modules as part of mongo object mongo.dbUsers = db.collection("users"); mongo.dbDisciplines = db.collection("disciplines"); console.log("aaa " + users.getAll()); //