Подтвердить что ты не робот

Комментированный код запускается при запуске команд MongoDB из JavaScript

Mongo.exe пытается выполнить прокомментированные строки в моем файле JavaScript?

У меня есть набор команд MongoDB Shell в файле JavaScript.

 use test;
    /*
     var categories = [];
     var sum = 0;

     var category = {
       _id: "",
       num: 0
     };

     var cur = db.itemdata.aggregate( [   
        { $group: { _id: "$category"  ,
            num : {$sum: 1 }
            }},
        { $sort: {"_id":1 }}
     ]).toArray();
       for(var i=0; i < cur.length; i++){
        sum += cur[i].num;
        categories.push(cur[i]);
       }

     category.num = sum;
     categories.unshift(category);

     */


     /* Example 2 */
     var category = 'Books';
     var cnt = db.itemdata.find({"category" : category}).count()
     print(cnt);

Я получаю ожидаемый результат для кода в Exampe2. однако, я вижу некоторые предупреждения/информацию в терминале.

2016-07-06T11: 44: 35.886-0500 E QUERY [thread1] SyntaxError: unterminated comment @(shell): 3: 0
2016-07-06T11: 44: 35.889-0500 E QUERY [thread1] ReferenceError: category is не определено: @(shell): 3: 2
2016-07-06T11: 44: 35.891-0500 E QUERY [thread1] ReferenceError: category is не определено: @(shell): 1:1
3
свидания

Я выполнил файл JavaScript на машине Windows, используя следующую команду/синтаксис:

mongo.exe < script.js

Почему я вижу эту ошибку, хотя переменная categories находится внутри блока комментариев.

Это не showstopper, хотелось бы понять, почему это происходит?

4b9b3361

Ответ 1

Это, вероятно, связано с тем, как оболочка mongo обрабатывает многострочные операции. Оболочка оценивает строки один за другим, если не видит то, что, по его мнению, будет охватывать несколько строк, и в этом случае он начнет операцию с несколькими линиями.

Используя команду mongo (без подачи туда входного файла), она может выглядеть примерно так:

> 40 + 2;
> 42
> for(var i = 0; i < 2; i++) {
> ...

где 40 + 2 оценивается сразу, но { будет сообщать mongo ждать своего закрывающего экземпляра } перед оценкой цикла for.

Это поведение описано здесь.

Проблема в том, что /* не является таким символом, поэтому mongo не будет ждать своего друга */. Он будет ждать еще одну строку, или пока вы не дадите ей то, что она думает, что она может оценить.

/*
    var categories = []; *
*/
 ...

Вышеизложенное не будет вызывать ошибки и будет продолжать ждать дальнейших инструкций, потому что как *, так и / являются двоичными операторами, поэтому монго не знает, что из оценки строки, заканчивающейся этим, может получиться что-то хорошее. Таким образом, он будет ждать, а затем, если вы добавите, скажем, 40 + 2, это приведет к 42 просто отлично, потому что теперь весь оцененный фрагмент кода от /* до 40 + 2 действителен JavaScript.

Возможно, это не самый изящный способ когда-либо определять, следует ли оценивать линию ввода, но как это работает сейчас. Аналогично,

/* {
    var categories = [];
    var sum = 0;
    ...other commented stuff..
}*/

будет работать, потому что mongo будет ждать закрытия } перед оценкой. Но это, вероятно, не то, что вы хотите делать каждый раз, когда вы пишете комментарий, и это оставит следующего разработчика интересно, является ли это новым и хип-способом для написания документации.

Решение 1

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

var template = `
    Awesome multi-line template string...


    ...or error?
 `;

Решение 2

Если вы не хотите постоянно беспокоиться, если в оболочке будут работать вещи (я этого не знаю), вы можете изменить способ выполнения script.

Вместо того, чтобы передать файл в mongo как mongo.exe < script.js, запустите команду mongo с script.js "в качестве аргумента: mongo.exe script.js.

Это будет оценивать код в режиме "сценарий" вместо "интерактивного", поэтому он решит эти проблемы. Некоторые вещи должны измениться, хотя для этого нужно работать. Помощники, такие как use test;, не будут работать в сценарийном режиме, вам нужно будет изменить его на свой экземпляр JavaScript var db = getDB('test');.

Эти различия описаны здесь.

Ответ 2

Избегайте использования комментариев блока /* */в javascript. Использовать только комментарии одиночной строки //.

Источник: Дуглас Крокфорд-JavaScript_ Хорошие детали (2008)

JavaScript предлагает две формы комментариев, блокировать комментарии, сформированные с помощью /* */и комментарии окончания строки, начинающиеся с //. Комментарии должны использоваться либерально улучшить читабельность ваших программ. Следите за тем, чтобы комментарии всегда опишите код. Устаревшие комментарии хуже, чем комментарии.

Форма комментариев комментариев к блоку была написана на языке PL/I. PL/Я выбрал эти странные пары в качестве символов для комментариев, потому что они вряд ли появятся в программах на языках, кроме возможно, в строковых литералах. В JavaScript эти пары также могут возникать в литералах регулярных выражений, поэтому комментарии блоков небезопасны для комментируя блоки кода. Например:

/*
var rm_a = /a*/.match(s);
*/

вызывает синтаксическую ошибку. Поэтому рекомендуется, чтобы /* */comments избегать и//комментарии. В этой книге//будет использоваться исключительно.