#javascript #node.js #embedded-javascript
#javascript #node.js #встроенный-javascript
Вопрос:
Я создал веб-приложение с 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:
Потому что ваши переменные являются локальными переменными в get
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});
}
});
});
Но опять же, это, вероятно, не имело бы смысла. Вероятно, вам понадобится какой-то механизм хранения для каждого пользователя или для каждого сеанса (например, база данных или истекающий кеш в памяти и т. Д.).
Комментарии:
1. Спасибо! Это имеет смысл, я только недавно начал использовать nodejs из Python, я даже не думал о области видимости!