2012-03-28 85 views
5

我在Node.js的连接和快速utils的

的世界新根据这一话题:What is Node.js' Connect, Express and “middleware”?
我得知Connect是的Express

部分我在代码中挖一点点,我发现了两个很有意思的文件:

./myProject/node_modules/express/lib/utils.js 

更好:

./myProject/node_modules/express/node_modules/connect/lib/utils.js 

这两个文件充满了有用的功能,我想知道如何正确调用它们。

据,在./myProject/app.js,这就是我做的:

var express = require('express') 
    , resource = require('express-resource') 
    , mongoose = require('mongoose') 
    , expresstUtils = 
     require('./node_modules/express/lib/utils.js'); 
    , connectUtils = 
     require('./node_modules/express/node_modules/connect/lib/utils.js'); 

但我发现它有点笨拙,那我的其他文件?

例如,这里是我的路线之一:

myResources = app.resource(
       'myresources', 
       require('./routes/myresources.js')); 

这里是myresources.js内容:

exports.index = function(req, res) 
{ 
    res.render('./myresources.jade', { title: 'My Resources' }); 
}; 

exports.show = function(req, res) 
{ 
    fonction resourceIsWellFormatted(param) 
    { 
    // Here is some code to determine whether the resource requested 
    // match with the required format or not 
    // return true if the format is ok 
    // return false if not 
    } 

    if (resourceIsWellFormatted(req.params['myresources'])) 
    { 
    // render the resource 
    } 
    else 
    { 
    res.send(400); // HEY! what about the nice Connect.badRequest in its utils.js? 
    } 
}; 

正如你可以在res.send(400)后的评论看,我问自己,如果可以使用Connect模块的utils.js文件中的badRequest函数。

那么md5函数在同一个文件中呢?

我必须把这个在我的myresources.js开始hugly调用使用它们?:

var connectUtils = 
     require('../node_modules/express/node_modules/connect/lib/utils.js'); 

,或者是有(即使是app.js)一个更优雅的解决方案吗?

非常感谢您的帮助!

回答

2

只有更优雅的方式,我想出了是(假设表达的是你的根里面的“node_modules”文件夹):

require("express/node_modules/connect/lib/utils"); 

节点安装在Windows上,节点版本0.8.2


和一些额外的信息:

这种方式,你不需要知道你在哪里,在路径和被迫使用相对路径(./或../),这是可以做到上任何文件嵌套级别。

我把根“node_modules”文件夹内所有的自定义模块(我叫我的文件夹“custom_modules”),并呼吁他们这样在任何级别的嵌套:

require("custom_modules/mymodule/something") 
+2

你不能指望这种技术是未来的证明。 'express @ 4.0.0'可能会彻底改变它在内部的功能,并且你可能会放弃'connect'(不太可能,但你明白了)。再次,如果您要在项目的依赖项中包含'connect'(与'express'使用的版本相同),此技术将无法工作。 – 2012-08-29 10:29:23

+0

@GauthamBadhrinathan我不会预见快速下降连接很快:)然而,连接可以很容易地改变他们的文件或它们的位置 - 哪些恕我直言是一个更大的危险。 即使包含连接到项目的依赖关系中,该技术仍然可以工作,路径仍然指向表达式,因此node.js将首先表达。 from node.js文档(文件模块)部分: *没有前导'/'或'。/'来表示一个文件,该模块可能是一个“核心模块”,或者是从node_modules文件夹加载的。* http://nodejs.org/api/all.html#all_file_modules – Leonidaz 2012-09-09 17:46:52

+0

是的,它会去'express '这是一个“核心模块”或者在“node_modules”中。但是,如果'connect'被添加为项目依赖项,那么在'express/node_modules'目录内不会找到名为'connect' *的目录。 – 2012-09-14 13:32:21

2

如果您想直接访问connect,我建议您安装connect作为项目的依赖项,以及express。那你可以var utils = require('connect').utils

+0

安装的整体架构的两倍,只是使用更短的'require'来访问某些实用程序功能似乎不会更优雅... – 2012-03-28 11:24:53

+2

当您构建一个大型项目时,您会发现模块之间有很多重复。例如,我有几个'mkdirp','async','eco'等等。这没什么大不了的。 – 2012-03-28 11:28:17

+0

尊重[DRY](http://en.wikipedia.org/wiki/Don't_repeat_yourself)“设计模式”对我来说是一件大事。在这一点上,我更喜欢copy/past juste我需要在我自己的utils模块中的功能。但它不是非常干,也不优雅... – 2012-03-28 12:39:55