Register Helper函数Node.JS + Express

JOS*_*Ftw 6 helpers local-storage node.js express

我正在尝试学习NodeJS和Express.我使用node-localstorage包来访问localstorage.这在直接在这样的函数中使用代码时有效

路线/ social.js

exports.index = function(req, res)
{
     if (typeof localStorage === "undefined" || localStorage === null) 
     {
        var LocalStorage = require('node-localstorage').LocalStorage;
        localStorage = new LocalStorage('./scratch');
     }

localStorage.setItem('myFirstKey', 'myFirstValue');
console.log(localStorage.getItem('myFirstKey'));
res.render('social/index', {title: "Start"});
}
Run Code Online (Sandbox Code Playgroud)

但是,在访问localstorage时,我不想在所有其他函数中反复编写此代码.我希望能够注册一个我可以访问的辅助函数

 var localStorage = helpers.getLocalStorage
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

我怎样才能在NodeJS中做到这一点?我见过关于app.locals的一些事情?但是如何在路线中访问app对象?

ver*_*loc 15

有很多方法可以执行此操作,具体取决于您计划使用辅助方法的方式/位置.我个人更喜欢utils使用我需要的所有帮助程序和实用程序方法设置我自己的node_modules文件夹.

例如,假设以下项目结构:

app.js
db.js
package.json
views/
   index.ejs
   ...
routes/
   index.js
   ...
node_modules/
   express/
   ...

只需添加一个utils文件夹下node_modules,有一个index.js包含文件:

function getLocalStorage(firstValue){
   if (typeof localStorage === "undefined" || localStorage === null) 
   {
      var LocalStorage = require('node-localstorage').LocalStorage;
      localStorage = new LocalStorage('./scratch');
   }
   localStorage.setItem('myFirstKey', 'myFirstValue');
   return localStorage;
}
exports.getLocalStorage = getLocalStorage;
Run Code Online (Sandbox Code Playgroud)

然后,只要你需要这个功能,只需要require模块utils:

var helpers = require('utils');
exports.index = function(req, res){
  localStorage = helpers.getLocalStorage('firstValue');
  res.render('social/index', {title: "Start"});
}
Run Code Online (Sandbox Code Playgroud)

编辑 正如Sean在评论中所指出的,只要您将node_modules文件夹命名为与Node的核心模块不同的名称,此方法就可以正常工作.这是因为:

如果核心模块的标识符传递给require(),则它们总是优先加载.例如,require('http')将始终返回内置的HTTP模块,即使存在该名称的文件.

  • 嗯,这实际上取决于你想要做什么.我知道"常识"是当你有多个应用程序时使用一个lib /文件夹来实现常见的功能(正如TJ Holowaychuk自己[这里](http://vimeo.com/56166857)所建议的那样),但是,其他人更喜欢有[本地化助手](https://github.com/madhums/nodejs-express-mongoose-demo/tree/master/test).我更喜欢这种方法,因为我不必担心`require('utils')`中的`utils`路径(所有其他方法都使用相对路径). (2认同)