2017-02-23 92 views
0

У меня есть служба REST API с экспресс-службой. Один API принимает два параметра:Узел: назначить открытую функцию для свойства объекта в другом файле

  • идентификаторов
  • типа

API-интерфейс должен разрешить id в некоторые детали и выполнить последовательную общие задачи для всех типов. Функция для определения идентификатора является другой базой для переменной type.

Я пытаюсь добиться этого путем создания 1 + n справочных файлов, где 1 является файл, содержащего поток разрешения идентификатора и все общих задач, и n относится к файлам, содержащим определенную функцию разрешения для идентификатора базы по типу. Пример кода, как показано ниже.

  • type1.js

    module.exports.resolveId = function(id, callback) {...callback}; 
    module.exports.otherFunctions.... 
    
  • common.js

    var type1Lib = require('./type1.js'); 
    var resFunc = {type1:typeLib.resolveId}; 
    function performTasks(id, type, callback) { 
        async.auto(
         resolve:function(cb) { 
          resFunc[type](id, cb); 
         }, 
         otherFunc:['resolve', function(cb) {cb}] 
        }, callback) 
    } 
    

При выполнении линии resFunc[type](id, cb), код падения, потому что resFunc[type] не определена.

Я попытался объявить функцию первого в type1.js

function resolveId (id, callback) {...callback}; 
    module.exports.resolveId = resolveId; 

, но это не помогает.

Я пропустил что-то очень фундаментальное здесь?

ответ

0

Если переменная type что-то вроде 1, 2, 3 ... тогда ваш требуйте вызова должен быть в performTasks теле:

function performTasks(id, type, callback) { 
    var resFunc = require('./type' + type); // and, no extension needed here 
    async.auto(
    resolve:function(cb) { 
     resFunc(id, cb); 
    }, 
    otherFunc:['resolve', function(cb) {cb}] 
    }, callback) 
} 

и ваш модуль будет:

function resolveId (id, callback) {...callback}; 
module.exports = resolveId; 

В качестве альтернативы вы можете require все модули заблаговременно:

var resFuncs = { 
    1: require('./type1'), 
    2: require('./type2'), 
    3: require('./type3') 
}; 

function performTasks(id, type, callback) { 
    async.auto(
    resolve:function(cb) { 
     resFuncs[type](id, cb); 
    }, 
    otherFunc:['resolve', function(cb) {cb}] 
    }, callback) 
} 

Редактировать

«module.exports» - это просто переменная, определенная в файле модуля, и это именно то, что требует() вызова. Вы можете назначить ему одну функцию или объект, состоящий из нескольких переменных, объектов или функций.

+0

Бюлент, спасибо за ответ. Мой тип - это строка, и каждый тип.js содержит более одной функции. Поэтому я не могу действительно делать module.exports = solveId; Плюс, какая разница между модулем.exports и module.exports.resolveId принципиально? Я тоже пытаюсь понять это на теоретическом уровне. – Lee

+0

У вас может быть несколько функций, это повлияет только на то, что вы ставите после последней точки 'require ('./ typeX').'. Если вы выполняете функцию module.exports =, то вы можете иметь только одну функцию экспорта и требовать завершения вызова); –

+0

Оба модуля.export и module.exports.resovleId назначают функцию свойству в природе, не так ли? Если они одинаковы по своей природе, зачем работать, а другой нет? – Lee