【问题标题】:I do not understand what this small block of code means我不明白这个小代码块是什么意思
【发布时间】:2019-06-15 09:01:09
【问题描述】:

所以在阅读了十几篇教程和帖子后,我发现'/todo/'+item 是这段代码发送请求的 URL,但整个 URL 是 https://MyHomePageURL + '/todo/'+item?但是当我输入那个 http url 时,页面是无效的。在我提出的每个请求之前和之后,我基本上都输入了任何可能的 http URL,并且只有主页有效的“http://127.0.0.1:5000/todo”,而其他 URL 无效。 (例如,当 item 的值为 chair 时,this -> http://127.0.0.1:5000/todo/chair 应该可以工作,但不能)。还有什么理由必须将此 Ajax 请求专门发送到该特定的 https:// URL?

我特别提到的代码来自文件“todo-list.js”

$(document).ready(function(){

$('form').on('submit', function(){

  var item = $('form input');
  var todo = {item: item.val()};

  $.ajax({
    type: 'POST',
    url: '/todo',
    data: todo,
    success: function(data){
      location.reload();
    }
  });

  return false;

});

$('li').on('click', function(){
  var item = $(this).text().replace(/ /g, "-");
  $.ajax({
    type: 'DELETE',
    url: '/todo/' + item,
    success: function(data){
      location.reload();
    }
  });
});

});

对于更广泛的上下文,这里是名为“todoController.js”的代码文件

var bodyParser = require('body-parser');

var data = [{item: 'chair'}, {item: 'flower'}, {item: 'bed'}];
var urlencodedParser = bodyParser.urlencoded({extended: false});

module.exports = function(app) {

app.get('/todo', function(req, res){
    res.render('todo', {todos: data});

});

app.post('/todo', urlencodedParser, function(req, res){
    data.push(req.body);
    res.json(data);
});


app.delete('/todo/:item', function(req, res){
    data = data.filter(function(todo){
        return todo.item.replace(/ /g, '-') !== req.params.item;
    });
    res.json(data);
});

};

这是启动名为“index.js”的应用程序的主要代码。

var express = require('express');
var app = express();

var todoController = require('./todoController');
app.set('view engine', 'ejs');

app.use(express.static('./'));

todoController(app);


app.listen(5000, '127.0.0.1');

另一个运行此应用程序的代码文件,名为“todo.ejs”

<html>
   <head>
    <title>Todo List</title>
    <script
    src="https://code.jquery.com/jquery-3.4.1.min.js"
    integrity="sha256- 
    CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
    crossorigin="anonymous"></script>
    <script src="assets/todo-list.js"></script>
    <link href="assets/styles.css" rel="stylesheet" 
     type="text/css">
  </head>
  <body>
    <h1>My Todo List</h1>
    <div id="todo-table">
      <form>
        <input type="text" name="item" placeholder="Add new 
         item..." required />
        <button type="submit">Add Item</button>
      </form>
      <ul>

              <% for(var i=0; i < todos.length; i++){ %>
                <li><%= todos[i].item %></li>
              <% } %>

      </ul>
    </div>

  </body>


</html>

【问题讨论】:

    标签: javascript jquery node.js ajax


    【解决方案1】:

    当您在浏览器地址栏中输入 URL 并回车时,浏览器将向服务器发出GET 请求。如果您检查您的服务器代码(您提供的第二个文件)该 URL /todo/:item 只接受 DELETE 请求。这就是当您从浏览器访问该 URL 时获得无效页面的原因。但是 URL /todo 定义了 GETPOST 方法。这就是为什么当您从浏览器点击该 URL 时,您在服务器中定义了 GET 响应。

    【讨论】:

    • 啊...我明白了...所以用外行的话来说,“127.0.0.1:5000/todo/"+item URL 不存在对吗?还是在处理 DELETE 请求时它存在一瞬间?
    • 它不存在。因为你的sever js文件中没有对应的代码。要使 GET 请求在该 URL 上工作,您的服务器代码中必须有类似 app.get('/todo/:item', function(req, res){ ... 的内容。
    • 我刚刚添加了为提供完整上下文而编写的整个代码文件,而我的代码在某处有app.get('/todo', function(req, res){ res.render('todo', {todos: data}); });
    • 好吧抱歉,但是......我仍然很困惑,为什么如果 '/todo/:item' URL 根本不存在,它仍然必须将删除请求发送到 '/todo/:项目的 URL。你能告诉我为什么吗?为什么原始代码要发送 DELETE 请求到 '/todo/:item' ?以及如何向根本不存在的 URL 发送请求?
    【解决方案2】:

    这很令人困惑,但据我所知,您想了解这里的代码是我的想法,ajax 正在对资源(即 todo/:item)发出 HTTP DELETE 请求

    $.ajax({
            type: 'DELETE',
    

    下面的代码在服务器端接收到的

    app.delete('/todo/:item', function(req, res){
    

    如果您在邮递员(而不是浏览器)中使用适当的设置运行它,您将能够看到它工作。希望对您有所帮助。

    【讨论】:

    • 感谢您的回答。所以......我仍然感到困惑的是我的代码说url: '/todo/' + item这意味着该URL必须存在吗?但是当我输入那个 http URL 时,它根本不存在。这是为什么呢?
    • 能否在浏览器窗口中打开Console,查看是否有错误。由于这是一个 Ajax 请求,您可能会在“网络”选项卡中找到该调用,这将使您更深入地了解错误。 (也请检查您的后端服务器是否正在运行)
    • so.. 我在浏览器中检查了控制台,这是我得到的错误:解析“完整性”属性时出错(“sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=”)。摘要必须是有效的 base64 编码值。
    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多