Правильный синтаксис для экстраполяции переменной с литералами шаблона JavaScript? - PullRequest
0 голосов
/ 10 марта 2019

Может кто-нибудь указать мне правильное направление относительно правильного синтаксиса литералов шаблона?

У меня есть следующий код (без литералов шаблона, работает нормально):

const dbUrl = 'localhost:27017/imgManager';
mongoose.connect('mongodb://' + dbUrl, { useNewUrlParser: true });

Теперь я хотел бы поместить useNewUrlParser: true в переменную:

const dbUrl = 'localhost:27017/imgManager',
      dbOptions = 'useNewUrlParser: true';
mongoose.connect('mongodb://' + dbUrl, { dbOptions });

Конечно, не работает, mongoose.connect() жалуется, что у него нет dbOptions:

$ node server.js 
Server up: http://localhost:3300
the options [dbOptions] is not supported

Полагаю, литералы шаблонов - это путь, но какой синтаксис правильный? Я попробовал следующее, но ничего не работает:

`mongoose.connect('mongodb://' + dbUrl, { ${dbOptions} });`
mongoose.connect(`mongodb://${dbUrl}, { ${dbOptions} }`);
mongoose.connect(`mongodb:\/\/${dbUrl}, { ${dbOptions} }`);

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 10 марта 2019

Литералы шаблона предназначены только для строк, а не для объектов.dbOptions должен быть объектом, а не строкой.

const dbOptions = { useNewUrlParser: true };

Тогда вы используете саму переменную:

mongoose.connect('mongodb://' + dbUrl, dbOptions);
1 голос
/ 10 марта 2019

Литералы шаблона не работают в произвольной позиции и не создают произвольный синтаксис JS.(Без тега) они создают только строки, и только одно значение никогда не может содержать два аргумента одновременно.В качестве опций вам нужно передать объект:

const dbUrl = 'localhost:27017/imgManager',
      dbOptions = { useNewUrlParser: true };
mongoose.connect(
   `mongodb://${ dbUrl }`, // first argument
    dbOptions // second argument
);

Если вы действительно получаете опции в виде строки, вам нужно будет проанализировать их в объект, например:

const dbUrl = 'localhost:27017/imgManager',
      dbOptions = '"useNewUrlParser": true';
mongoose.connect(
   `mongodb://${ dbUrl }`, // first argument
    JSON.parse(`{${ dbOptions }}`) // second argument. The string is '{' + dbOptions + '}'
);
0 голосов
/ 10 марта 2019

Поскольку dbOptions является строкой в ​​вашем подходе, { dbOptions } создает объект js следующим образом:

// cause that mongoose is complaining because it's not expecting 
// options with property name dbOptions
{ dbOptions: 'useNewUrlParser: true' } 

Вы должны сделать следующее

const dbUrl = 'localhost:27017/imgManager',
      dbOptions = {useNewUrlParser: 'true'};    

// `mongodb://${dbUrl}` will generate the following string:
//  "mongodb://localhost:27017/imgManager" 
mongoose.connect(`mongodb://${dbUrl}`, dbOptions);
...