ws.on('request', function(request) {
// filter here
if (...) request.reject();
});
var data = {
key1: "value1",
key2: "value2",
key3: "value1",
key4: "value2",
key5: "value3"
};
var index = {};
for (var key in data) {
var value = data[key];
if (index[value]) index[value].push(key);
else index[value] = [key];
}
console.dir(index);
{ value1: [ 'key1', 'key3' ],
value2: [ 'key2', 'key4' ],
value3: [ 'key5' ] }
Файловая система рассматривается в самую последнюю очередь.
Выризать аттачи из письма нельзя.
// user.js
module.exports = function() {
var foo = 'bar';
var fn = function() {
// тут будет доступно значение foo = 'bar'
return foo;
}
return fn;
}
var controllers = {};
controllers.user = require('./controllers/user')(); // обратите внимание на ()
controllers.account = require('./controllers/account')();
console.log(controllers.user()); // bar
console.log(controllers.account()); // baz
// user.js
module.exports = { foo: 'bar' };
var controllers = {};
controllers.user = require('./controllers/user');
controllers.account = require('./controllers/account');
console.log(controllers.user.foo); // bar
console.log(controllers.account.foo); // baz
var ncp = require('ncp').ncp;
ncp(source, destination, function (err) {
if (err) { return console.error(err); }
console.log('done!');
});
Выше очень правильно заметили, что нужно разбивать методы на логические части поменьше, а не писать простыней, но еще есть проблема в том, что нужно сделать несколько запросов в БД или другим внешним источникам, к файлам, другим серверам, и потом на основе всех фрагментов данных, полученных асинхронно, исполнить бизнес-логику и сформировать ответ. Асинк прекрасно с этим справляется, как в примере ниже.
var dataRequests = [];
// массив запросов к разным данным (БД, файлы, сетевые вызовы)
var dataResults = {};
// я предпочитаю не использовать массив results, который дает async
// а вместо этого делать именованные фрагменты данных
// и писать их в свой хеш
// добавляем один запрос к данным
dataRequests.push(function(callback) {
db.queryRow(
'SELECT * FROM TableName1 where Field1=?', [someValue1],
function(err, res) {
dataResults.firstPiceName = res;
callback(err, null);
}
);
});
// добавляем второй запрос к данным
dataRequests.push(function(callback) {
db.queryValue(
'SELECT count(*) FROM TableName2 where Field2=?',
[someValue2],
function(err, res) {
dataResults.secondPiceName = res;
callback(err, null);
}
);
});
// вызываем массив запросов асинхронно
async.series(dataRequests, function(err, results) {
// тут делаем бизнес-логику над dataResults в котором у нас есть
// все фрагменты данных .firstPiceName и .secondPiceName
// и формируем общий результат
});
А еще рекомендую ставить тег "node.js" на вопросы по ноде.
Какой бы не взяли, а JavaScript все равно нужно будет осваивать, начните с него, а там, может, и Node.js приглянется.
Вот Вы пока боитесь ноды, это все из-за неуверенности в новой и незнакомой технологии. Не бойтесь и смело пишите и API на ноде, и маршрутизатор на ноде, и статику нодой отдавайте, и подписку клиентов на серверные события тоже на ноде делайте. Однородность технологий стоит того, чтобы в ней разобраться. Я конечно специалист не по Java, но Абсолютно не ясно, почему вы думали использовать Java Spring MVC для бэкендов. По сути бэкенды - это API, реализованные или как RPC (stateful, взаимодействие с сохранением состояния на обоих концах) или как REST (stateless, взаимодействие без сохранения состояния). При чем тут MVC к API ? Что должен делать API, так это организовывать доступ к БД, обработку данных, выдачу ответов в нужном формате (пусть JSON), ну и в зависимости от того RPC у или REST - API может или хранить состояние в памяти или не хранить его, делая отдельные запросы независимыми, но лишая нас возможности кешировать объекты предметной области в памяти в рамках сессии. По этому поводу полезный ответ я оставил вот тут - http://toster.ru/q/49346#answer_183494
Теперь про матрешки, чтобы от них уйти в написании API, проще всего использовать async. Основная проблема в том, что нужно сделать несколько запросов в БД и потом на основе всех фрагментов данных, полученных асинхронно, исполнить бизнес-логику и сформировать ответ.
var dataRequests = [];
// массив запросов к разным данным (БД, файлы, сетевые вызовы)
var dataResults = {};
// я предпочитаю не использовать массив results, который дает async
// а вместо этого делать именованные фрагменты данных
// и писать их в свой хеш
// добавляем один запрос к данным
dataRequests.push(function(callback) {
db.queryRow(
'SELECT * FROM TableName1 where Field1=?', [someValue1],
function(err, res) {
dataResults.firstPiceName = res;
callback(err, null);
}
);
});
// добавляем второй запрос к данным
dataRequests.push(function(callback) {
db.queryValue(
'SELECT count(*) FROM TableName2 where Field2=?',
[someValue2],
function(err, res) {
dataResults.secondPiceName = res;
callback(err, null);
}
);
});
// вызываем массив запросов асинхронно
async.series(dataRequests, function(err, results) {
// тут делаем бизнес-логику над dataResults в котором у нас есть
// все фрагменты данных .firstPiceName и .secondPiceName
// и формируем общий результат
});