VSCode Intellisense и навигация по коду с NodeJS RestAPI - PullRequest
0 голосов
/ 23 января 2019

Как видно из названия, я не могу понять, как заставить Навигацию по коду и Intellisense работать в немного сложной структуре кода.Я полностью готов приложить усилия для документирования, необходимые для того, чтобы эта работа работала (например, добавлен @typedefs и т. Д.)https://auth0.com/blog/developing-well-organized-apis-with-nodejs-joi-and-mongo/)

Итак, как это работает - есть центральная библиотека для ссылок на модули и библиотеки.

servicelocator.js - Поддерживает карту всех зарегистрированных служб.

ServiceLocator.prototype.register = function (dependencyName, constructor) {
  if (typeof constructor !== 'function') {
    throw new Error(dependencyName + ': Dependency constructor is not a function');
  }

  if (!dependencyName) {
    throw new Error('Invalid depdendency name provided');
  }

  this.dependencyMap[dependencyName] = constructor;
};

ServiceLocator.prototype.get = function (dependencyName) {
  if (this.dependencyMap[dependencyName] === undefined) {
    throw new Error(dependencyName + ': Attempting to retrieve unknown dependency');
  }

  if (typeof this.dependencyMap[dependencyName] !== 'function') {
    throw new Error(dependencyName + ': Dependency constructor is not a function');
  }

  if (this.dependencyCache[dependencyName] === undefined) {
    const dependencyConstructor = this.dependencyMap[dependencyName];
    const dependency = dependencyConstructor(this);
    if (dependency) {
      this.dependencyCache[dependencyName] = dependency;
    }
  }

  return this.dependencyCache[dependencyName];
};

Servicelocator используется в примере внедрения зависимостей - DI.js

serviceLocator.register('mycustomservice', () => {
    return require('../lib/mycustomservice');
});
...
...
...

serviceLocator.register('abcController', (serviceLocator) => {
    const mycustomservice = serviceLocator.get('mycustomservice');

    const abcController = require('../controllers/abcController');
    return new abcController(mycustomservice)
})

Тогда код для контроллера является стандартным классом, подобным

class abcController 
{
    constructor(mycustomservice)
    {
        this.customService = mycustomservice;
        ....
        ....
    }
}

Так что здесь кроется моя проблема.Я получаю автозаполнение, чтобы работать здесь? (Mycustomservice.js is module.exports =)

Мои ограничения:

  1. Я не могу работать с TypeScript / Coffee и т. Д..
  2. Структура и потоки фиксированы (это нельзя изменить)
  3. Я бы предпочел VSCode, если есть выход - если нет - открыть и для других рекомендуемых IDE.

Большое спасибо!


[Update] Игра с Typedefs в комментариях в стиле JSDoc

/*
* @typedef {import('../lib/mycustomservice')} CustomService
*
*/ 
class abcController 
{     
    /**
     * @param {CustomService} mycustomservice
     */

    constructor(mycustomservice)
    {

        this.customService = mycustomservice;
        ....
        ....
    }
}

Это для меня как-то.Попытка выяснить, как его автоматизировать или создать центральный файл вместо этого (пока не очень знаком с JSDocs или Typescript ....) 1040 *

...