Предоставление переменной node.js клиенту - PullRequest
0 голосов
/ 24 марта 2019

Я хотел бы предоставить серверную переменную node.js клиенту.Я пытаюсь получить экспресс-выставить на работу.Я не уверен, как инициализировать и использовать эту библиотеку.

В руководстве по экспресс-экспозиции использование не имеет смысла

var express = require('express');
var expose = require('express-expose');
app = expose(app);
app.expose(...);

как использовать app в expose (app') до того, как он был инициализирован?

Я использовал

const app = expose(express());
app.expose('var some = "variable";','head');

, но, похоже, это тоже не работает.

Может кто-нибудь снабдить меня, пожалуйста, примером, который инициализируетбиблиотека express-expose и экспорт var 'some' клиенту?

(Под клиентом я подразумеваю, что он будет доступен для всех моих файлов javascript как глобальная переменная, чтобы я мог это сделать) console.log (some); ', и это напечатало бы его значение)

Ответы [ 3 ]

3 голосов
/ 24 марта 2019

Использование Pug

Поскольку вы используете Express с Pug, вы можете просто вызвать функцию res.render и присвоить ей нужную переменную . Вот как это сделать.

Допустим, у вас есть шаблон с именем index.pug, он может выглядеть так:

html
  head
    title= title
  body
    h1= message

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

const someVariable = 'hello world!';

app.get('/', function (req, res) {
  res.render('index', { title: 'Hey', message: someVariable })
})

Записка о express-expose

Библиотека express-expose не поддерживается, а не обновлялась в течение 5 лет . Мой совет - просто визуализировать вашу переменную, как описано ранее, или просто использовать запросы AJAX.

Замечание об использовании глобальной переменной

Я использую движок вида pug. Это передано на вид, но я хочу это как глобальная переменная JavaScript.

Лучшей идеей является использование Наследование шаблонов для создания "универсальных макетов" и расширения их по мере необходимости. Совместное использование глобальной переменной с файлом, который вы визуализируете, не будет магически обновляться во внешнем интерфейсе, если вы изменяете его в серверной части. Даже если переменная является глобальной.

Если вы хотите отразить «изменения в реальном времени» , вам следует заглянуть в Socket.io .

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

Это похоже на запах кода ... Но, тем не менее, есть более чистые способы сделать это.

Если вы хотите предоставить объект данных, то есть объект, содержащий только ключи и значения, вы можете встроить его в отображаемую веб-страницу, сделать его доступным через некоторую конечную точку API, которую клиент может получить с помощью запроса AJAX, или выставить необработанный файл Javascript, который можно включить через <script> (или, я думаю, script(...) в pug).

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

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

Если вам нужно больше подробностей о том, как это может работать, пожалуйста, прокомментируйте:)

Редактировать: Также имейте в виду, что использование встроенных методов и методов include не позволит обновлять переменную на лету. Если вам нужен клиент для отслеживания каких-либо изменений данных по мере их изменения на сервере, вы можете использовать AJAX. Это лучший метод, на мой взгляд. Он предлагает вам максимальную гибкость.

Другое редактирование: Судя по проблемам в экспресс-проекте , он, кажется, не очень хорошо поддерживается и, возможно, имеет проблемы с безопасностью. А пока я бы этого избегал. Может быть, позже это будет полезно и безопасно.

1 голос
/ 24 марта 2019

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

В вашем файле шаблона EJS это будет выглядеть как

<% if (data) { %>
  <input type="hidden" value="<%= data %>" id="myGlobal"/>
<% } %>

вы должны передать значение данных в вашей функции res.render('template',{data:"hello"}) в шаблон.

Вы можете получить доступ к этому значению переменной из клиента с помощью простого document.getElementById("myGlobal"). Снова не передавайте конфиденциальную информацию в скрытые поля.

Если вы хотите передать конфиденциальную информацию, внедрите конечную точку на своем сервере с аутентификацией и вызовите конечную точку от клиента с помощью вызова ajax. Это также лучший подход для обновления значения переменной на стороне клиента.

...