javascript - 我的 JavaScript Post 和 Get 函数与 python 服务器发生故障

标签 javascript python post server get

对于我的类(class),我正在制作一个简单的网络应用程序,它本质上是一张可以评论的图片。问题是每次我输入新评论时,它都不会显示,而是显示以前的评论。看起来 GET 在 POST 完成更新服务器上的列表之前被调用。但是,也许问题出在其他地方,我不知道。

我做了一些研究,似乎问题是由于异步造成的,但是我从阅读中尝试的所有内容都无法按照我实现的方式工作,包括回调函数。

这是我的代码:

Javascript

var messages = []

function getData() {
    fetch('http://localhost:8080/bananas').then(function(response) {
        return response.json();
    }).then(function(data) {
        messages = []
        for (i=0; i < Object.keys(data).length; i++) {
            messages.push(data[i]);
            console.log(data[i]);
        }
    })
}



function update() {
    var box = document.getElementById("messages");
    box.innerHTML = "";
    getData();
    for (i=0; i < messages.length; i++) {
        var newDiv = document.createElement("div");
        newDiv.className = "comment";
        var curM = document.createTextNode(messages[i]);
        newDiv.appendChild(curM);
        box.appendChild(newDiv);
    }
    document.getElementById("comment").value = "";

}

update();


var submit = document.getElementById("submit");
submit.onclick = function () {
    postData();
    update();

}

var clickenter = document.getElementById("comment");
clickenter.addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        document.getElementById("submit").click();
    }
});

function postData() {
    var content = document.getElementById("comment").value;
    if (content.length > 0) {

        message = "message=" + encodeURIComponent(content)
        fetch('http://localhost:8080/bananas', {
            body: message,
            method: 'POST',
            header: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        })
    }
}

HTML

    <!DOCTYPE html>
<html>
<head>
    <title>Page Title</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="container">
        <img src="image.jpg">
        <h2> Comments </h2>
        <div id="messages">
        </div>


        <textarea id="comment" type="text"> </textarea>
        <input id="submit" type="button" value="Submit">




    </div>

    <script src="app.js"></script>


</body>
</html>

我的Python服务器:

from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs
import json

comments = []


class MyRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == "/bananas":
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.send_header("Access-Control-Allow-Origin", "*")
            self.end_headers()
            print(comments)
            jsonstring = json.dumps(comments)
            self.wfile.write(bytes(jsonstring, "utf-8"))

    def do_POST(self):
        if self.path == "/bananas":
            length = self.headers["Content-length"]
            length = int(length)
            if length > 0:
                body = self.rfile.read(length).decode("utf-8")
                strMessage = parse_qs(body)['message'][0]
                comments.append(strMessage)
                self.send_response(201)
                self.send_header("Access-Control-Allow-Origin", "*")
                self.end_headers()


def main():
    try:
        listen = ("127.0.0.1", 8080)
        server = HTTPServer(listen, MyRequestHandler)

        print("Listening...")
        server.serve_forever()
    except KeyboardInterrupt:
        print ("^C entered, stopping web server...")
        server.socket.close()

main()

谢谢

最佳答案

这应该是您需要的一切。我没有你的其余代码,所以我无法看到它是否正常运行,但逻辑应该在那里。

var messages = []
var submit = document.getElementById("submit");
var clickenter = document.getElementById("comment");

submit.onclick = function () {
  var content = document.getElementById("comment").value;
  
  if (content.length > 0) {
    postData()
      .then(function() {
        return getData();
      })
      .then(function(msgs) {
        update();
      });
  }
  else {
    getData()
      .then(function(msgs) {
        update();
      });
  }
  
  update();
}

clickenter.addEventListener("keyup", function(event) {
  event.preventDefault();
  
  if (event.keyCode === 13) {
    document.getElementById("submit").click();
  }
});

update();

function getData() {
  return fetch('http://localhost:8080/bananas')
    .then(function(response) {
      return response.json();
    })
    .then(function(data) {
      messages = []
      for (i=0; i < Object.keys(data).length; i++) {
        messages.push(data[i]);
        console.log(data[i]);
      }
      return messages;
    });
}

function update() {
    var box = document.getElementById("messages");
    box.innerHTML = "";
    for (i=0; i < messages.length; i++) {
        var newDiv = document.createElement("div");
        newDiv.className = "comment";
        var curM = document.createTextNode(messages[i]);
        newDiv.appendChild(curM);
        box.appendChild(newDiv);
    }
    document.getElementById("comment").value = "";

}

function postData() {
  return fetch('http://localhost:8080/bananas', {
    body: "message=" + encodeURIComponent(content),
    method: 'POST',
    header: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  });
}

关于javascript - 我的 JavaScript Post 和 Get 函数与 python 服务器发生故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48820483/

相关文章:

python - 在 Django 模型字段中存储位置历史记录

python - 区分Python中的文件和目录

ios - 错误解析 JSON 响应 Cocoa 错误 3840

php - 在 Swift2 中发送 php POST 请求需要很长时间

javascript - 无法使用vuejs和electronicjs创建简单的文件资源管理器

javascript - Vuex + vue 在使用字典作为状态对象时没有反应

python - 如何在不重新加载的情况下返回主页

android - Cordova android 应用程序 - POST 请求返回 "forbidden access"错误

javascript - 列表从容器底部开始向上追加

javascript - 我怎样才能避免在每个模块中都需要定义(['jquery'])?