如何在变量中设置变量app.js
并使变量在所有路由中可用,至少在路由中的index.js
文件中可用。使用快速框架和node.js
Answers:
要创建全局变量,只需声明不带var
关键字的变量即可。(通常来说,这不是最佳做法,但在某些情况下可能会有用-请注意,因为它将使变量随处可见。)
这是visionmedia / screenshot-app的示例
文件app.js:
/**
* Module dependencies.
*/
var express = require('express')
, stylus = require('stylus')
, redis = require('redis')
, http = require('http');
app = express();
//... require() route files
文件路由/ main.js
//we can now access 'app' without redeclaring it or passing it in...
/*
* GET home page.
*/
app.get('/', function(req, res, next){
res.render('index');
});
//...
app
相关联?
correct
一个。
使用快速对象上可用的“设置”和“获取”方法实际上很容易做到这一点。
如下例所示,假设您有一个名为config的变量,其中包含与配置相关的内容,并且希望在其他地方使用:
在app.js中:
var config = require('./config');
app.configure(function() {
...
app.set('config', config);
...
}
在routes / index.js中
exports.index = function(req, res){
var config = req.app.get('config');
// config is now available
...
}
req.app.get('name')
就像魅力一样。此属性保存对使用中间件的Express应用程序实例的引用。expressjs.com/pt-br/api.html#req.app
进行此操作的一种好方法是使用app.locals
Express本身提供的功能。
这是文档。
// In app.js:
app.locals.variable_you_need = 42;
// In index.js
exports.route = function(req, res){
var variable_i_needed = req.app.locals.variable_you_need;
}
要声明全局变量,您需要使用全局对象。像global.yourVariableName。但这不是真正的方法。要在模块之间共享变量,请尝试使用注入样式,例如
someModule.js:
module.exports = function(injectedVariable) {
return {
somePublicMethod: function() {
},
anotherPublicMethod: function() {
},
};
};
app.js
var someModule = require('./someModule')(someSharedVariable);
或者您可以使用代理对象来做到这一点。像集线器。
someModule.js:
var hub = require('hub');
module.somePublicMethod = function() {
// We can use hub.db here
};
module.anotherPublicMethod = function() {
};
app.js
var hub = require('hub');
hub.db = dbConnection;
var someModule = require('./someModule');
简而言之,这里有很好的解释:
http://www.hacksparrow.com/global-variables-in-node-js.html
因此,您正在使用一组Node模块(例如Express.js之类的框架)工作,突然感到需要全局设置一些变量。如何在Node.js中使变量成为全局变量?
最常见的建议是“声明不带var关键字的变量”或“将变量添加到全局对象”或“将变量添加到GLOBAL对象”。您使用哪一个?
首先,让我们分析全局对象。打开终端,启动节点REPL(提示)。
> global.name
undefined
> global.name = 'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> delete global.name
true
> GLOBAL.name
undefined
> name = 'El Capitan'
'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> var name = 'Sparrow'
undefined
> global.name
'Sparrow'
这是一个有用的问题,但通过给出实际的代码示例,可能会更有用。甚至链接的文章实际上也没有显示实现。因此,我谦卑地提交:
在app.js
文件中,文件顶部:
var express = require('express')
, http = require('http')
, path = require('path');
app = express(); //IMPORTANT! define the global app variable prior to requiring routes!
var routes = require('./routes');
app.js将没有对方法的任何引用app.get()
。将这些保留在单独的路由文件中进行定义。
routes/index.js
:
require('./main');
require('./users');
最后是一个实际的路由文件routes/main.js
:
function index (request, response) {
response.render('index', { title: 'Express' });
}
app.get('/',index); // <-- define the routes here now, thanks to the global app variable
我的首选方式是使用循环依赖关系*,该节点支持
var app = module.exports = express();
为您的第一笔业务var app = require('./app')
可以访问它var express = require('express');
var app = module.exports = express(); //now app.js can be required to bring app into any file
//some app/middleware, config, setup, etc, including app.use(app.router)
require('./routes'); //module.exports must be defined before this line
var app = require('./app');
app.get('/', function(req, res, next) {
res.render('index');
});
//require in some other route files...each of which requires app independently
require('./user');
require('./blog');
正如其他人已经分享的那样,app.set('config', config)
这非常有用。我只是想添加一些在现有答案中没有看到的非常重要的内容。Node.js实例在所有请求之间共享,因此虽然在全局范围内共享某些对象config
或router
对象可能非常实用,但在请求和用户之间可以全局存储运行时数据。考虑这个非常简单的示例:
var express = require('express');
var app = express();
app.get('/foo', function(req, res) {
app.set('message', "Welcome to foo!");
res.send(app.get('message'));
});
app.get('/bar', function(req, res) {
app.set('message', "Welcome to bar!");
// some long running async function
var foo = function() {
res.send(app.get('message'));
};
setTimeout(foo, 1000);
});
app.listen(3000);
如果您访问/bar
并且遇到另一个请求/foo
,您的消息将是“ Welcome to foo!”。这是一个愚蠢的例子,但可以理解这一点。
为什么不同的node.js会话共享变量,对此有一些有趣的观点。。
我解决了同样的问题,但是我不得不写更多的代码。我创建了一个server.js
文件,该文件使用Express来注册路由。它公开了一个函数,register
其他模块可以使用该函数注册自己的路由。它还公开了一个功能,startServer
以开始监听端口
server.js
const express = require('express');
const app = express();
const register = (path,method,callback) => methodCalled(path, method, callback)
const methodCalled = (path, method, cb) => {
switch (method) {
case 'get':
app.get(path, (req, res) => cb(req, res))
break;
...
...
default:
console.log("there has been an error");
}
}
const startServer = (port) => app.listen(port, () => {console.log(`successfully started at ${port}`)})
module.exports = {
register,
startServer
}
在另一个模块中,使用此文件创建路由。
help.js
const app = require('../server');
const registerHelp = () => {
app.register('/help','get',(req, res) => {
res.send("This is the help section")
}),
app.register('/help','post',(req, res) => {
res.send("This is the help section")
})}
module.exports = {
registerHelp
}
在主文件中,同时引导它们。
app.js
require('./server').startServer(7000)
require('./web/help').registerHelp()
我用了app.all
app.all()方法对于将“全局”逻辑映射为特定路径前缀或任意匹配非常有用。
就我而言,我正在使用confit进行配置管理,
app.all('*', function (req, res, next) {
confit(basedir).create(function (err, config) {
if (err) {
throw new Error('Failed to load configuration ', err);
}
app.set('config', config);
next();
});
});
在路线上,您只需 req.app.get('config').get('cookie');
这是一件很容易的事,但是人们的答案却是混乱而又复杂的。
让我向您展示如何在express
应用程序中设置全局变量。因此,您可以根据需要从任何路由访问它。
假设您要从主/
路径设置全局变量
router.get('/', (req, res, next) => {
req.app.locals.somethingNew = "Hi setting new global var";
});
因此,您将从所有路线中获取req.app。然后必须使用locals
将全局数据设置为。如上所示,您已经准备就绪。现在
我将向您展示如何使用这些数据
router.get('/register', (req, res, next) => {
console.log(req.app.locals.somethingNew);
});
就像上面的register
路线一样,您正在访问的数据已被更早设置。
这是使此事情起作用的方法!
req.app.locals
。