【问题标题】:Post Request to NodeJS Backend向 NodeJS 后端发布请求
【发布时间】:2017-09-26 18:38:14
【问题描述】:

我目前正在尝试将 json 数据发布到 json 文件。为了做到这一点,我设置了一个 NodeJS 和 express 服务器,但有些事情总是搞砸了。我不断收到这样的反馈:

jquery-3.2.1.js:9566 POST http://localhost:3000/Alpha/json/details.json 404(未找到)

我阅读了其他几个问题,指出问题可能出在我的服务器端脚本中,并且我没有正确指定 json 文件。

JS 客户端发布脚本:

function sendFormData(){
            var formData = JSON.stringify($("#myForm").serializeArray());

            $.ajax({
                type: "POST",
                url:"../json/details.json",
                data: formData,
                success: function(){
                    alert("something!");
                }
            });
        } 

我的 HTML 表单:

<form action="XXXXXXXX"id="myForm"><label for="id">ID</label>
    <input type="text" id="id" name="id" placeholder="Item ID number" ng-model="newDetails.id">

       <label for="system">System</label>
       <input type="text" id="system" name="lastname" placeholder="Type of System" ng-model="newDetails.system">

       <label for="date">Date</label>
       <input type="text" id="date" name="lastname" placeholder="dd-mm-yyyy"  ng-model="newDetails.date">

       <label for="priority">Priority</label>
       <select id="priority" name="priority" ng-model="newDetails.priority">
         <option value="high">High</option>
         <option value="medium">Medium</option>
         <option value="low">Low</option>
        </select>
        <label for="description">Description</label>
        <textarea class="form-control" rows="3" id="desc" name="description" ng-model="newDetails.description"></textarea>

        <label for="priority">Status</label>
        <select id="status" name="status" ng-model="newDetails.status">
          <option value="OPEN">OPEN</option>
          <option value="ON HOLD">ON HOLD</option
          <option value="CLOSED">CLOSED</option>
        </select>

       <input type="button" value="Submit" class="btn" data-dismiss="modal" style="background-color:#FFBE00; color:#002244;" onClick="sendFormData()">
</form>

NodeJS 脚本:

    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
    var path = require('path');

    app.use(bodyParser.json());
    app.use('../json', express.static(path.join(__dirname, 'json')));
    app.use('/', express.static(__dirname + '/'));


    app.post('/formdata', function(req, res) {
        console.log( req.body.id + req.body.system + req.body.date + req.body.priority + req.body.description + req.body.status);
        res.send("ok");
    });

    app.use(bodyParser.json());

    // Get information submitted
    app.post('/', function(req, res) {
        console.log("Information received !");
        console.log(req.body);
        res.send("Ok!");
    });

app.listen(3000);

我的节点脚本工作正常吗?为什么找不到json文件?

root/Alpha/json/details.json - 是json文件路径

我的节点脚本在根目录

【问题讨论】:

  • .. 在路径中有特殊含义。
  • @KevinB 我知道,它会上升一个目录。这就是我使用它的原因,即使没有两个点,我也尝试过。
  • 对我来说看起来不对的是您在 app.use 中的使用方式。您用于访问 json 的路径与 ../json 不匹配
  • 应该怎么改?
  • 我不知道。你打算让它成为什么?我建议使用与您希望客户端用来访问所述静态文件的路由匹配的路由路径。我不知道你打算 ../json 表示什么。

标签: javascript jquery json node.js


【解决方案1】:

我看到你对这里的很多事情感到困惑。我认为您应该退后一步,了解绝对和相对 URL,然后才能了解如何修复您的代码。关于如何修复它的建议如下,但如果你只是盲目地应用这些建议,它对你没有好处。您需要了解为什么您需要执行以下操作,否则您以后将面临更多问题。阅读有关 URL、路径和 HTTP 的信息:

至少阅读有关如何构建绝对和相对 URL、在 HTTP 请求中作为路径发送的内容、如何遍历文件系统以及 /... 的含义的基本信息。

现在,解决方案。

这毫无意义:

app.use('../json', express.static(path.join(__dirname, 'json')));

因为您无法提供位于根路径上一级的 URL。

当您在页面上时从客户端访问 ../x/y.json,例如http://www.example.com/a/b/c/index.html 那么客户端将请求的实际上是 http://www.example.com/a/b/x/y.jsonthis 是您需要在后端提供的服务。您实际提供的文件是另一回事,但这是您需要提供的路径。

我认为你需要重新考虑:

  1. .../ 在相对 URL 中的含义
  2. 您要提供的实际 URL - 可以是任何内容,但您的客户端和服务器必须达成一致

有意义的是:

app.use('/json', express.static(path.join(__dirname, 'json')));

但如果您仍然提供__dirname 并且它已经包含json 目录,那将是多余的:

app.use('/', express.static(__dirname + '/'));

顺便说一句,上面可能只是:

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

但不建议(并且不需要)为您的后端文件提供服务。您应该将所有静态内容放在一个目录中,例如称为 staticpublichtml 或其他任何名称,并提供此目录:

app.use('/', express.static(path.join(__dirname, 'static')));

并将您的json 目录放在该目录的

有关如何正确提供静态内容的更多信息和示例,请参阅以下答案:

【讨论】:

  • 这只会让我更加困惑。我没有太多使用 NodeJS 的经验..
  • @User199932 这并不复杂。请参阅this answer 中的第一个示例。你可以下载它from here。只需将json 目录放在那里的public 目录中,然后您放入json 的任何内容都可以使用http://localhost:3000/json/xxx.json 访问,其中xxx.json 是您放在那里的文件。请参阅我的答案中链接中的示例。一切都有工作示例,您只需要放置文件。
  • 谢谢,我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2021-06-08
相关资源
最近更新 更多