我是Node.js和JavaScript的新手。我有一个特定的问题,但大多需要有关最佳解决方案的建议。
我正在运行Node服务器。我希望客户端能够向服务器提交字符串,然后服务器显示一个显示字符串数据的新HTML页面。
我正在使用Express和Socket.io。
在以下文件中,客户端会看到index.html
,然后在提交表单后会看到return.html
。我将输入字符串打印到控制台,输出是预期的(无论用户输入什么)。但return.html
永远不会使用输入字符串进行更新。
我还尝试在异步系列中发送return.html
页面和change_result
调用,但sendFile
函数永远不会结束,系列中的第二个函数永远不会被调用。在之前的尝试中,它在setTimeout
函数周围emit('change_result')
间歇性地工作。
为什么对change_result
的呼叫没有做任何事情?我使用相同的技术更新以前版本中原始index.html
的标题。我应该路由到localhost.../return.html
并在那里发送帖子数据,还是类似的东西?
server.js
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var bodyParser = require('body-parser') //for POST request
app.use( bodyParser.json() ); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
extended: true
}));
server.listen(8080, function() {
console.log("Server running on port 8080.");
});
var dir = __dirname;
app.get('/', function(req, res) {
res.sendFile(dir + '/index.html');
});
app.post('/', function(req, res) {
var query1=req.body.input1
console.log("Server: In post request.")
console.log(query1);
res.sendFile(dir + '/return.html');
io.emit('change_result', {
result: query1
});
});
的index.html
<!DOCTYPE html>
<html>
<body id="body">
<form method="post" action="http://localhost:8080">
String: <input type="text" name="input1" id="input1" />
<input type="submit" id="button1" value="Submit" />
</form>
</body>
</html>
return.html
<!DOCTYPE html>
<html>
<body id="body">
<p id="heading1">Result: </p>
<script>
document.addEventListener('DOMContentLoaded', function() {
var socket = io();
socket.on('change_result', function(data) {
document.getElementById('heading1').innerHTML = "Result: \""+data.result"\"";
});
});
</script>
</body>
</html>
答案 0 :(得分:1)
我在socket.io内部没有膝盖,但IMO的问题是,服务器无法知道是否有任何监听器准备就绪。
我认为你应该准备一个&#39; ready&#39;事件,一旦加载了return.html,然后收听&#39; change_result&#39;。还将套接字通信与服务器上的POST响应分开。像这样。
server.js
$d1 = strtotime('2017-05-15');
$d2 = strtotime('2017-05-31');
$div = 24 * 3600;
echo abs(($d2 - $d1) / $div); // 16 days
return.html
var query;
app.get('/', function(req, res) {
res.sendFile(dir + '/index.html');
});
app.post('/', function(req, res) {
query = req.body.input1;
console.log("Server: In post request.");
console.log(query);
res.sendFile(dir + '/return.html');
});
io.on('connection', function(socket) {
socket.on('ready', function() {
socket.emit('change_result', {result: query});
});
});