Ответ 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');
.
Эти различия описаны здесь.