Почему мои переменные не обновляются в node.js? - PullRequest
0 голосов
/ 12 апреля 2019

Я создал веб-приложение с node.js для получения сообщений из темы SNS с помощью запроса POST и регистрации их в консоли, а затем отображаю их на веб-странице. Если я публикую сообщение в своей теме, сообщение будет напечатано вконсоль, но ничего не обновляется на моей веб-странице?

Это мой код для app.js

const express = require("express");
const request = require('request')
const bodyParser = require('body-parser')
const app = express();
app.use(express.static('public'));
app.set("view engine", "ejs")


app.get('/', function (req, res) {
  let subject = "Your Subject Will Appear Here";
  let message = "Your Message Will Appear Here";
  res.render("index", {subject:subject, message:message});
})

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.post('/', (req, res) => {
  let body = ''
  req.on('data', (chunk) => {
    body += chunk.toString()
  })  
  req.on('end', () => {
    let payload = JSON.parse(body)
    if (payload.Type === 'Notification') {
      console.log(payload.Message);
      let subject = payload.Subject;
      let message = payload.Message;
      res.render("index", {subject:subject, message:message});
    }
  });
});

app.listen(80, process.env.IP, function(request, response){
    console.log("## SERVER STARTED ##");
});

Это мой код для index.js

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <link rel="stylesheet" type="text/css" href="/css/style.css">
    <link href='https://fonts.googleapis.com/css?family=Open+Sans:300' rel='stylesheet' type='text/css'>
  </head>
  <body>
    <div class="container">
      <fieldset>
        <% if(subject !== null){ %>
            <p>SNS Subject: <%= subject %></p>
          <% } %>
        <% if(message !== null){ %>
            <p>SNS Message: <%= message %></p>
          <% } %>
      </fieldset>
    </div>
  </body>
</html>

1 Ответ

0 голосов
/ 12 апреля 2019

Поскольку ваши переменные локальные переменные в функциях обратного вызова get и post. Если вы хотите, чтобы они сохранялись за пределами этих обратных вызовов, вам нужно переместить их в область, которая не исчезнет, ​​когда обратный вызов вернется.

Например, это делает их глобальными модулями НО кажется, что было бы странным для каждого POST, независимо от того, откуда он, изменять содержимое несвязанных GET (см. *** комментарии) :

// *** Declared at module scope
let subject = "Your Subject Will Appear Here";
let message = "Your Message Will Appear Here";

app.get('/', function (req, res) {
  // *** Not declared here
  res.render("index", {subject:subject, message:message});
})

// ...

app.post('/', (req, res) => {
  let body = ''
  req.on('data', (chunk) => {
    body += chunk.toString()
  })  
  req.on('end', () => {
    let payload = JSON.parse(body)
    if (payload.Type === 'Notification') {
      console.log(payload.Message);
      subject = payload.Subject; // <======= *** no `let`, we're not declaring here
      message = payload.Message; // <======= *** same
      res.render("index", {subject:subject, message:message});
    }
  });
});

Но опять же, это, вероятно, не имело бы смысла. Вероятно, вам понадобится какой-то механизм хранения для каждого пользователя или для каждого сеанса (например, база данных или устаревший кэш в памяти и т. Д.).

...