天天看點

nodejs學習:express本地、響應全局變量 1、global全局變量 2、app、response變量傳遞

轉自: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變量:

  1. /**
  2. * Module dependencies.
  3. */
  4. global.test = "ydr.me";
  5. var express = require('express');
  6. var routes = require('./routes');
  7. var user = require('./routes/user');
  8. var http = require('http');
  9. var path = require('path');
  10. var app = express();
  11. // ...以下省略

在/app5/routes/index.js修改為:

  1. /*
  2. * GET home page.
  3. */
  4. console.log(global.test);
  5. exports.index = function(req, res) {
  6. console.log(global.test);
  7. res.render('index', {
  8. title: 'Express'
  9. });
  10. };

啟動app,然後通路http://localhost:3000/,在cmd視窗即可看到:

nodejs學習:express本地、響應全局變量 1、global全局變量 2、app、response變量傳遞

因為nodejs服務是單線程的,是以global變量本地全局變量,無法完成響應變量的目的,也就是說本地變量與請求無關,隻與目前程序有關。

2、app、response變量傳遞

如果不想使用global申明全局變量,也可以使用對象傳遞的方式來模拟獲得全局變量的目的,尤其是在nodejs這種子產品化程式設計裡面,更加的靈活和巧妙。

/app5/app.js修改為:

  1. /**
  2. * Module dependencies.
  3. */
  4. var express = require('express');
  5. var routes = require('./routes');
  6. var user = require('./routes/user');
  7. var http = require('http');
  8. var path = require('path');
  9. var app = express();
  10. app.locals.test = "ydr.me";
  11. routes=routes(app);
  12. // ... 以下省略

/app5/routes/index.js修改為:

  1. /*
  2. * GET home page.
  3. */
  4. // 入口傳遞 app 對象
  5. module.exports = function(app) {
  6. console.log(app.locals.test);
  7. return {
  8. index: function(req, res) {
  9. console.log(app.locals.test);
  10. res.render('index', {
  11. title: 'Express'
  12. });
  13. },
  14. };
  15. }

當然,這種情況和第一次使用global存儲本地全局變量的結果是一緻的。在express中,請求(request)、響應(response)和下一步(next)三個變量是全局傳遞的,可以使用它們來存儲全局的響應變量。

/app5/app.js修改為:

  1. /**
  2. * Module dependencies.
  3. */
  4. var express = require('express');
  5. var routes = require('./routes');
  6. var user = require('./routes/user');
  7. var http = require('http');
  8. var path = require('path');
  9. var app = express();
  10. // 本地全局變量
  11. app.locals.test = "ydr.me";
  12. routes=routes(app);
  13. app.use(function(request, response, next){
  14. // 響應全局變量
  15. response.locals.time=Date.now();
  16. next();
  17. });
  18. // ... 以下省略

/app5/routes/index.js修改為:

  1. /*
  2. * GET home page.
  3. */
  4. // 入口傳遞 app 對象
  5. module.exports = function(app) {
  6. console.log(app.locals.test);
  7. return {
  8. index: function(req, res) {
  9. console.log(app.locals.test);
  10. console.log(res.locals.time);
  11. res.render('index', {
  12. title: 'Express'
  13. });
  14. },
  15. };
  16. }

結果如圖:

nodejs學習:express本地、響應全局變量 1、global全局變量 2、app、response變量傳遞

3、global、response結合

綜合1和2,可以使用global全局對象存儲本地全局變量,使用response存儲響應全局變量。

/app5/app.js修改為:

  1. /**
  2. * Module dependencies.
  3. */
  4. // 本地全局變量
  5. // 将設定為不可删除、隻讀
  6. Object.defineProperty(global,"test",{
  7. value:"ydr.me",
  8. writable:false,
  9. configurable:false,
  10. });
  11. var express = require('express');
  12. var routes = require('./routes');
  13. var user = require('./routes/user');
  14. var http = require('http');
  15. var path = require('path');
  16. var app = express();
  17. app.use(function(request, response, next){
  18. // 響應全局變量
  19. response.locals.time=Date.now();
  20. next();
  21. });
  22. // ... 以下省略

/app5/routes/index.js修改為:

  1. /*
  2. * GET home page.
  3. */
  4. console.log(global.test);
  5. // =>ydr.me
  6. module.exports = {
  7. index: function(req, res) {
  8. console.log(global.test);
  9. // =>ydr.me
  10. console.log(res.locals.time);
  11. res.render('index', {
  12. title: 'Express'
  13. });
  14. },
  15. };

将全局變量定義為不可寫、不可配置(不可删除),防止在其他地方複寫全局變量。

  • 文章正文已結束,感謝閱讀。本文系作者原創,如需轉載請注明文章來源( 前端部落格),不勝感激。
  • 文章标題: 《nodejs學習9:express本地、響應全局變量》
  • 文章連結: http://qianduanblog.com/post/nodejs-learning-9-express-local-response-variable.html