转自:http://qianduanblog.com/post/nodejs-learning-9-express-local-response-variable.html
在做应用程序、Web程序等,都需要事先配置全局变量,而不是将程序编写为硬编码。本地全局变量,指的是被多处重复使用的的变量,一般类指静态常量,如网站的名称、地址、描述、作者等信息;而响应全局变量,指的是被多处重复使用动态变量,一般类指访问用户的id、邮箱、积分、用户名等信息。
在PHP中,可以使用$_GLOBALS、define等来申明全局变量,在js中使用window对象来申明全局变量,而在nodejs中全局对象为global。
1、global全局变量
那么,是不是可以用global申明变量在项目中使用呢?有这样一个app5。
- /app5/app.js
- /app5/routes/index.js
- ...其他省略
在/app5/app.js中新增一个global.test变量:
- /**
- * Module dependencies.
- */
- global.test = "ydr.me";
-
- var express = require('express');
- var routes = require('./routes');
- var user = require('./routes/user');
- var http = require('http');
- var path = require('path');
-
- var app = express();
- // ...以下省略
在/app5/routes/index.js修改为:
- /*
- * GET home page.
- */
- console.log(global.test);
- exports.index = function(req, res) {
- console.log(global.test);
- res.render('index', {
- title: 'Express'
- });
- };
启动app,然后访问http://localhost:3000/,在cmd窗口即可看到:

因为nodejs服务是单线程的,所以global变量本地全局变量,无法完成响应变量的目的,也就是说本地变量与请求无关,只与当前进程有关。
2、app、response变量传递
如果不想使用global申明全局变量,也可以使用对象传递的方式来模拟获得全局变量的目的,尤其是在nodejs这种模块化编程里面,更加的灵活和巧妙。
/app5/app.js修改为:
- /**
- * Module dependencies.
- */
-
- var express = require('express');
- var routes = require('./routes');
- var user = require('./routes/user');
- var http = require('http');
- var path = require('path');
-
- var app = express();
-
- app.locals.test = "ydr.me";
- routes=routes(app);
- // ... 以下省略
/app5/routes/index.js修改为:
- /*
- * GET home page.
- */
-
- // 入口传递 app 对象
- module.exports = function(app) {
- console.log(app.locals.test);
- return {
- index: function(req, res) {
- console.log(app.locals.test);
- res.render('index', {
- title: 'Express'
- });
- },
- };
- }
当然,这种情况和第一次使用global存储本地全局变量的结果是一致的。在express中,请求(request)、响应(response)和下一步(next)三个变量是全局传递的,可以使用它们来存储全局的响应变量。
/app5/app.js修改为:
- /**
- * Module dependencies.
- */
-
- var express = require('express');
- var routes = require('./routes');
- var user = require('./routes/user');
- var http = require('http');
- var path = require('path');
-
- var app = express();
-
- // 本地全局变量
- app.locals.test = "ydr.me";
- routes=routes(app);
-
- app.use(function(request, response, next){
- // 响应全局变量
- response.locals.time=Date.now();
- next();
- });
- // ... 以下省略
/app5/routes/index.js修改为:
- /*
- * GET home page.
- */
-
- // 入口传递 app 对象
- module.exports = function(app) {
- console.log(app.locals.test);
- return {
- index: function(req, res) {
- console.log(app.locals.test);
- console.log(res.locals.time);
- res.render('index', {
- title: 'Express'
- });
- },
- };
- }
结果如图:
3、global、response结合
综合1和2,可以使用global全局对象存储本地全局变量,使用response存储响应全局变量。
/app5/app.js修改为:
- /**
- * Module dependencies.
- */
-
- // 本地全局变量
- // 将设置为不可删除、只读
- Object.defineProperty(global,"test",{
- value:"ydr.me",
- writable:false,
- configurable:false,
- });
-
- var express = require('express');
- var routes = require('./routes');
- var user = require('./routes/user');
- var http = require('http');
- var path = require('path');
- var app = express();
-
- app.use(function(request, response, next){
- // 响应全局变量
- response.locals.time=Date.now();
- next();
- });
- // ... 以下省略
/app5/routes/index.js修改为:
- /*
- * GET home page.
- */
-
- console.log(global.test);
- // =>ydr.me
-
- module.exports = {
- index: function(req, res) {
- console.log(global.test);
- // =>ydr.me
- console.log(res.locals.time);
- res.render('index', {
- title: 'Express'
- });
- },
- };
将全局变量定义为不可写、不可配置(不可删除),防止在其他地方复写全局变量。