2016-07-11 1 views
0

Я использую стек MEAN и динамически отправляю параметры запроса на конечные точки сервера Nodejs. Мой клиент Контроллер:MEAN Nodejs JSON.parse, передающий данные от клиента к серверу

$http.get('/api/things',{params:{query:query}}).then(response => { 
     this.awesomeThings = response.data; 
     socket.syncUpdates('thing', this.awesomeThings); 
    }); 

, где запрос представляет собой значение, вводят в контроллер. Это функция контроллера сервера (который работает):

export function index(req, res) { 
    var query = req.query.query && JSON.parse(req.query.query) 
    Thing.find(query).sort({_id:-1}).limit(20).execAsync() 
    .then(respondWithResult(res)) 
    .catch(handleError(res)); 
} 

Вышеперечисленные работы, но я пытаюсь понять линии

var query = req.query.query && JSON.parse(req.query.query) 

, как я никогда не видел этого раньше (и я не исходят из программирования). I console.logged query и понимаю, что это объект (который требуется Mongodb), но когда я console.logged (JSON.parse (req.query.query)) или JSON.parse (query), чтобы узнать окончательный вывод, программа перестает работать без сообщений об ошибках, очень странно .. Если кто-то может объяснить приведенный выше синтаксис и почему это нужно сделать, чтобы это работало, это было бы очень полезно. PS, когда я пытаюсь настроить консоль JSON .parse как так, он не загружается, даже если это не должно иметь никакого эффекта:

export function index(req, res) { 
    var query = req.query.query && JSON.parse(req.query.query) 
    var que = JSON.parse(req.query.query) 
    Thing.find(query).sort({_id:-1}).limit(20).execAsync() 
    .then(respondWithResult(res)) 
    .catch(handleError(res)); 
    console.log("que"+que) 
} 
+0

Возможный дубликат [Назначение с двойной амперсанд "&&"] (http://stackoverflow.com/questions/12878612/assignment-with-double-ampersand) – DAXaholic

+0

Это единственный код, который будет работать. Если я не кодирую его таким образом, это не сработает. Коды выше взяты из фактических рабочих кодов, я просто спрашиваю, что означает этот синтаксис и почему он работает. –

ответ

1

function one() { 
 
    var x = {}; 
 
    var res = JSON.parse(x.y); 
 
    console.log(res); 
 
} 
 

 
function two() { 
 
    var x = {}; 
 
    var res = x.y && JSON.parse(x.y); 
 
    console.log(res); 
 
}
<button onclick="one()">ERROR</button> 
 
<button onclick="two()">NO ERROR</button>

var x = data && JSON.parse(data); 

Поскольку выражение оценивается слева, первые данные вычисляются.

Если не определено, тогда следующая часть ->JSON.parse() не будет выполнена. С другой стороны, если данные определены, синтаксический анализ проверяется, и результат возвращается и сохраняется в x.

Главное преимущество в том, что синтаксический разбор не выполняется, если переменная не определена.

это может быть эквивалентно высказыванию:

if(data) {x = JSON.parse(x);} 
+0

Странно, что если я делаю var x = JSON.parse (data), данные не загружаются, но когда я делаю x = data && JSON.parse (data), он работает. –

+0

, вероятно, 'data' не определено, а' data && 'защищены от запуска' JSON.parse() ', который в противном случае вызывал бы ошибку. – Iceman

+0

Что делать, если данные равны нулю? –

Смежные вопросы