轉自: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'
- });
- },
- };
将全局變量定義為不可寫、不可配置(不可删除),防止在其他地方複寫全局變量。
- 文章正文已結束,感謝閱讀。本文系作者原創,如需轉載請注明文章來源( 前端部落格),不勝感激。
- 文章标題: 《nodejs學習9:express本地、響應全局變量》
- 文章連結: http://qianduanblog.com/post/nodejs-learning-9-express-local-response-variable.html