NodeJS可变范围

时间:2015-03-31 21:12:59

标签: javascript php node.js mongodb

我对整个NodeJS堆栈非常非常新,而且我正在尝试简化一个简单的登录系统进行练习。

跳到我的问题,

app.js

...
var mongoose = require( 'mongoose' );
var templates = require( './data/inc.js' ); // includes schema structures
...

user.js - 包含在inc.js

...
module.exports =
{
    "Schema" : new exports.mongoose.Schema({
      "uid": mongoose.Schema.Types.ObjectId,
      "username": { type:String, unique:true },
      "alias": String,
      "credentials":
      {
        "salt": String,
        "password": String,
        "key": String
      },
      "profile":
      {
        "age": { type: Number, min: 18 }
      },
      "last_login": Date,
      "updated": { type: Date, default: Date.now }
    })
}
...

' user.js'上面的脚本不起作用,因为它无法访问在app.js'中实例化的mongoose对象变量。脚本。在PHP中,任何包含/必需的脚本都能够从父脚本访问变量,但在NodeJS中我知道它,例如我必须重新要求/声明mongoose变量才能创建我的模式树。

user.js的

...
* var mongoose = require( 'mongoose' ); // must include in script to use mongoose object

module.exports
{
   ...
}
...

是否有任何变通方法可以让我获得与PHP相同的范围访问权限?

2 个答案:

答案 0 :(得分:1)

答案是有一些解决方法,但你真的不想永远使用它们,除了你想要攻击你的应用程序中所有正在运行的模块的全局范围的东西,包括所有依赖项(mongoose)和所有ITS依赖项。

<强> override.js

global.thisIsNowAvailable = true;

<强>鳞片状file.js

if (thisIsNowAvailable) { /* ... */ }

<强> index.js

require("./override");
require("./flaky-file");

同样适用于全局原型的重写方法,等等。

除非您的图书馆超级棒,并且打算在需要时拦截,解析和解释代码

require("babel/register"); // all loaded modules can now be written in ES6

出于其他原因这样做会导致可怕的代码库......

<强>虚线index.js

require("flaky-file");
require("override");
// you might have just attempted to reference a variable that doesn't exist, 
// thrown an error and crashed your entire server
// (not just a single connection, like PHP...  ...the entire server went down,
// for everyone, and it has to be restarted).

将模块视为单独的功能范围 这样做很简单:

needs-mongoose.js

function doSomeInitWithMongoose (db) { /* ... */ }
function doSomeRuntimeWithMongoose (db, params) { /* ... */ }

module.exports = mongoose => {
    doSomeInitWithMongoose(mongoose);

    return {
      run: params => {
        /* ... app is run here ... */
        doSomeRuntimeWithMongoose(mongoose, params);
      }
    };
};

<强>配置-mongoose.js

var mongoose = require("mongoose");
function configure (db, cfg) { /* ... */ return db; }

module.exports = config => {
    var configuredDB = configure(mongoose, config);
    return configuredDB;
};

<强> main.js

// to support arrow functions and other awesome ES6, including ES6 modules
require("babel/register");

var config = require("./mongoose-config");
var db = require("./configures-mongoose")(config);
var app = require("./needs-mongoose")(db);

app.run({ /* ... */ });

修改

将最后几个文件更新为结构正确的伪程序(当然,它绝对没有任何作用);

当然,如果index.jsserver.jsrequire("babel/register");,然后加载main.js(不包含Babel),则require全部require("babel/register"); require("./es6-main"); Babel以南的语句可以写成ES6模块,没有问题。

<强> server.js

import config from "./mongoose-config";
import configureDB from "./configures-mongoose";
import loadApp from "./needs-mongoose";

const db = configureDB(config);
const app = loadApp(db);

app.run({ /* ... */ });

<强> ES6-main.js

getFunc( config )( data );

注意,现在我正在命名我最初返回的函数,因为在JS返回函数时,你可以立即调用它...

import

...但您无法立即对var utils = require("./utils"); // doesn't need any information utils.helperFunc(data); 语句采取行动。

经验法则是,如果您要将对象导出到外部世界,它应该有0个外部依赖项,或者稍后将通过某种类型的setter设置所有外部依赖项:

var catsAndPorn = true;
var internets = [];
var SeriesOfTubes = require("series-of-tubes");
var internet = new SeriesOfTubes( catsAndPorn );
internets.push( internet );

var bigOlFramework = require("big-ol-framework");
bigOlFramework.setDBPool( myDBCluster );
http.createServer( bigOlFramework.connectionHandler ).listen( 8080 );

mongoose

不需要外部信息用于实际的init(尽管可能需要它们自己的内部依赖项)。

如果你想返回依赖外部init的东西,可以导出工厂/构造函数,或导出一个接受你的配置/数据的函数,然后在init序列之后返回你想要的东西。

编辑2

这里的最后一条建议是,就var Router = require("router"); var router = new Router( ); require("./routes/login")(router); require("./routes/usesrs")(router); require("./routes/articles")(router); 用法而言,或Gulp,类似程度,或几个路由器...
...当你想要一个将其内容注册到注册表的单个文件,或者需要一个核心组件,以便能够返回一些内容时,Node中最有意义的模式是返回一个函数然后执行init

import ArticlesController from "./../controller/articles"; // or wherever
var articles = new ArticlesController();
module.exports = router => {
    router.get("/articles", ( ) => articles.getAll( ));
    router.post("/articles", ( ) => articles.create( ));
};

“./routes / articles.js”可能看起来像

var mongoose = require("mongoose");
var Users = require("./schema/users")(mongoose);

因此,如果您希望根据架构构建ORM,您可能会这样做:

module.exports = mongoose => {
    return new mongoose.Schema({ /* ... */ });
};

“./schema/users”的样子:

{{1}}

希望有所帮助。

答案 1 :(得分:0)

为什么不这样做?

var mongoose = require( 'mongoose' );
...
"Schema" : new mongoose.Schema({

而不是:

exports.mongoose.Schema // I'm not sure where you got `exports.mongoose` from.

在要求时,您也不必使用.js

var templates = require( './data/inc' );

修改

我相信你不能像PHP那样做。此外,还需要缓存需求,因此无需担心re要求。