Утилиты Connect и Express

Я новичок в мире Node.js

Согласно этой теме: Что такое Connect, Express и «промежуточное ПО» в Node.js?
Я узнал, что Connect был частью Экспресс

Я немного покопался в коде и нашел два очень интересных файла:

./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), я спрашиваю себя, можно ли использовать функцию badRequest, которая находится в файле utils.js модуля Connect.

А как насчет красивой функции md5 в том же файле?

Должен ли я размещать этот приветственный призыв в начале моего myresources.js, чтобы использовать их?

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

или есть более элегантное решение (даже для app.js)?

Заранее спасибо за вашу помощь!


person Pascal Qyy    schedule 28.03.2012    source источник


Ответы (2)


единственный более элегантный способ, который я придумал (при условии, что экспресс находится внутри вашей корневой папки "node_modules"):

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

установка узла на windows, версия узла 0.8.2


и немного дополнительной информации:

таким образом вам не нужно знать, где вы находитесь на пути, и вам не нужно использовать относительные пути (./ или ../), это можно сделать на любом уровне вложенности файлов.

Я помещаю все свои пользовательские модули в корневую папку «node_modules» (я назвал свою папку «custom_modules») и называю их таким образом на любом уровне вложенности:

require("custom_modules/mymodule/something")
person Leonidaz    schedule 13.08.2012
comment
Вы не можете рассчитывать на то, что этот метод пригоден для будущего. [email protected] может полностью изменить его внутреннее функционирование и, насколько вы знаете, может упасть connect (маловероятно, но суть вы поняли). И снова: если вы включите connect (ту же версию, что и express) в зависимости вашего проекта, этот метод не сработает. - person Gautham Badhrinathan; 29.08.2012
comment
@GauthamBadhrinathan Я не предвижу, что в ближайшем будущем вы сразу откажетесь от подключения :) Тем не менее, connect может легко изменить расположение своих файлов или то, что в них находится - что, ИМХО, представляет гораздо большую опасность. этот метод должен работать, даже если вы включили connect в зависимости вашего проекта, путь по-прежнему указывает на выражение, поэтому node.js сначала перейдет к выражению. из раздела документации node.js (File Modules): Без начальных символов '/' или './' для обозначения файла модуль является либо основным модулем, либо загружается из папки node_modules. nodejs.org/api/all.html#all_file_modules - person Leonidaz; 09.09.2012
comment
Да, он перейдет к express, который является либо основным модулем, либо находится в node_modules. Но если connect добавлен как зависимость проекта, тогда вы не найдете каталог с именем connect внутри каталога express/node_modules. - person Gautham Badhrinathan; 14.09.2012
comment
@GauthamBadhrinathan Да, вы правы, если вы добавите подключение в качестве зависимости, местоположение подключения будет другим. Однако следует знать, что они делают, и знать, что если они в конечном итоге добавят connect в качестве зависимости, им придется реорганизовать код и изменить пути, которые они используют в своих require(). - person Leonidaz; 12.12.2012

Если вы хотите получить доступ к connect напрямую, я предлагаю вам установить connect как зависимость вашего проекта вместе с express. Тогда вы можете var utils = require('connect').utils.

person Linus Thiel    schedule 28.03.2012
comment
Установите весь фреймворк дважды, просто для доступа к некоторым служебным функциям с более коротким require не кажется более элегантным ... - person Pascal Qyy; 28.03.2012
comment
Когда вы создаете большой проект, вы обнаружите, что у вас много дублирования между модулями. Например, у меня есть несколько mkdirp, async, eco и т. Д. Это не имеет большого значения. - person Linus Thiel; 28.03.2012
comment
Уважать шаблон проектирования DRY для меня - большое дело. На этом этапе я предпочитаю копировать / вставлять функции, которые мне нужны, в моем собственном модуле utils. Но он не очень СУХОЙ и не изящный… - person Pascal Qyy; 28.03.2012
comment
Что я могу сказать. Управлять зависимостями сложно. Разрешение зависимостей Node - лучшее, с чем я работал, и я с удовольствием храню несколько копий каждой библиотеки, если это означает, что мой код работает, тестирование работает и развертывание работает. Я не вижу смысла спорить с вами об элегантности - я здесь, чтобы помочь! - person Linus Thiel; 28.03.2012
comment
поэтому вызова connectUtils = require('./node_modules/express/node_modules/connect/lib/utils.js'); кажется достаточным в отношении дублирования всего фреймворка или копирования / вставки альтернативных вариантов. Мой вопрос был просто: есть ли более элегантное решение? - person Pascal Qyy; 29.03.2012
comment
var connnect = require ('connect'), utils = connect.utils; по сути, вы обращаетесь к модулю connect utils, так что connect.utils - довольно хороший способ сказать это. Я сомневаюсь, что какие-либо накладные расходы по этой причине являются чем-то большим, чем незначительные, и даже если они есть, это произойдет только один раз при запуске приложения. - person alzclarke; 03.05.2012
comment
Трудно сказать, нарушает ли это DRY или нет, но это фундаментально для того, как узел обрабатывает модули. Вы вводите явную зависимость от модуля (а не косвенную зависимость через второй модуль), и способ сообщить об этом узлу - добавить его в свой package.json и указать явное требование ('connect'). Если вам интересно, почему node работает таким образом, вам следует прочитать о npm. Это очень осознанный выбор. - person Waylon Flinn; 21.07.2012
comment
@LinusGThiel Вы должны знать, что когда вы явно добавляете зависимость (скажем, [email protected]) в проект, и эта конкретная зависимость (та же версия) также используется другой зависимостью в вашем проекте (скажем, [email protected]), тогда npm сохраняет только одну копию [email protected] ( в node_modules каталога вашего проекта). Более того, когда вы require модулей, конкретный модуль инициализируется только один раз. Когда вы снова require, вы просто получаете ссылку на инициализированный модуль. - person Gautham Badhrinathan; 28.08.2012
comment
@GauthamBadhrinathan: Это неправда. Если вы сделаете то, что описываете, будет одно соединение в ./node_modules/connect, а другое (возможно, другая версия) в .node_modules/express/node_modules/connect. Это очень задумано, и IMO одна из лучших частей node.js. - person Linus Thiel; 28.08.2012
comment
@LinusGThiel Если это разные версии, то да. Но если есть такая же версия, то вы получите только одну как /node_modules/connect. Кажется, я не могу найти статью, которая объясняет это. В любом случае см. пример списка зависимостей. Как видите, в express нет connect или cookie, даже если они являются зависимостями. - person Gautham Badhrinathan; 29.08.2012
comment
@GauthamBadhrinathan: Вы правы! Я этого не знал. Хорошо знать! - person Linus Thiel; 29.08.2012