【问题标题】:"cannot post /" nodeJS“无法发布/”nodeJS
【发布时间】:2017-09-18 11:51:35
【问题描述】:

我想用 nodeJS 和 socket.io 实时开发一个待办事项列表

我可以读取任务,但是在插入任务时,我有一个 POST 错误“无法发布/”但是服务器正确接收到任务,因为我可以在控制台日志中读取它并返回到本地主机,添加了任务...我认为我必须做错我的帖子,但我不知道如何正确地做。 这是我的代码

index.html:

<body>
        <h1>Todo list temps réel !</h1>
 
        <form action="/" method="post" id="formulaire_tache">
            <input type="text" name="message" id="tache" placeholder="Votre tache..." size="50" autofocus />
            <input type="submit" id="envoi_tache" value="Envoyer" />
        </form>
 
        <section id="zone_todo">
          <ul>
 
          </ul>
        </section>
 
 
        <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
        <script src="/socket.io/socket.io.js"></script>
        <script>
 
            // Connexion à socket.io
            var socket = io.connect('http://localhost:8080');
 
            // On declenche l'evenement nouveau_client
            socket.emit('nouveau_client');
 
            socket.on('initTodo', function(todolist){
              //On recupere les taches
              console.log('Client');
              todolist.forEach(function(tache, index){
                $('#zone_todo').prepend('<li><a href="/todo/supprimer/' + index + '">✘</a>' + tache + '</li>');
              })
            })
 
            // Lorsqu'on envoie le formulaire, on transmet le message et on l'affiche sur la page
            $('#formulaire_tache').submit(function () {
                var message = $('#tache').val();
                socket.emit('ajout', message); // Transmet la tache au serveur
                insereMessage(message); // Affiche la tache aussi sur notre page
                $('#tache').val('').focus(); // Vide la zone et remet le focus dessus
                return false; // Permet de bloquer l'envoi "classique" du formulaire
            });
 
            // Ajoute un message dans la page
            function insereMessage(tache) {
                $('#zone_todo').prepend('<li><a href="/todo/supprimer/' + index + '">✘</a>' + tache + '</li>');
            }
        </script>
    </body>

我的 app.js

    var app = require('express')(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    ent = require('ent'), // Permet de bloquer les caractères HTML (sécurité équivalente à htmlentities en PHP)
    fs = require('fs');
    var todolist = ['test', 'test2'];
 
 
 
app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});
 
 
io.sockets.on('connection', function (socket) {
    // Dès qu'on nous donne un pseudo, on le stocke en variable de session et on informe les autres personne
 
    socket.on('nouveau_client', function() {
        console.log(todolist);
        socket.emit('initTodo', todolist);
    });
 
    // Dès qu'on reçoit un message, on récupère le pseudo de son auteur et on le transmet aux autres personnes
    socket.on('ajout', function (tache) {
        tache = ent.encode(tache);
        todolist.push(tache);
        console.log('tache ajouter ' + tache);
        //socket.broadcast.emit('ajout', {tache: tache});
    });
});
 
server.listen(8080);

还有我的控制台日志:

node app.js 

[ 'test', 'test2' ]

tache ajouter azerty

[ 'test', 'test2', 'azerty' ]

感谢您的帮助

【问题讨论】:

  • 我看不到您在服务器代码中的哪个位置收听帖子。根据代码,您似乎也没有发送帖子。应该防止表单提交。我的猜测是发生了 JS 错误,因此无法到达 return false
  • 你认为,我需要用 socket.IO 收听帖子吗?我在想不仅仅是为了快递?
  • 不,我认为你不需要听帖子。这可能是另一个问题的征兆,因为它没有阻止表单提交。

标签: node.js express socket.io


【解决方案1】:

您不能使用return false 来阻止提交的正常行为。 出于这个原因,调用到达node 没有/ 的 post 方法。

你必须使用:

$('#formulaire_tache').submit(function (event) {

      event.preventDefault();   // you must use this!

      var message = $('#tache').val();
      socket.emit('ajout', message); // Transmet la tache au serveur
      insereMessage(message); // Affiche la tache aussi sur notre page
      $('#tache').val('').focus(); // Vide la zone et remet le focus dessus
});

【讨论】:

  • 谢谢,但它不工作,这一次,当我返回本地主机时没有添加任务
  • 没关系,它可以与您的代码一起使用,但也可以与我的代码一起使用,如果我删除了表单上的 method=post,谢谢 :)
【解决方案2】:

用于 POST 的 Nodejs sn-p

NodeJS 原生

var http = require("http");

var options = {
  "method": "POST",
  "hostname": "localhost",
  "port": "8080",
  "path": "/api/subject",
  "headers": {
    "content-type": "application/json",
    "cache-control": "no-cache"
  }
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({ 
  author: "balu",
  title: 'Test NodeJS  POST' }));

req.end();

NodeJS 请求

    var request = require("request");

    var options = { method: 'POST',
      url: 'http://localhost:8080/api/subject',
      headers: 
       { 'cache-control': 'no-cache',
         'content-type': 'application/json' },
      body: 
       { author: 'Balu',
         title: 'NodeJS Post' },
      json: true };

    request(options, function (error, response, body) {
      if (error) throw new Error(error);

      console.log(body);
    });

NodeJS Unirest

var unirest = require("unirest");

var req = unirest("POST", "http://localhost:8080/api/subject");

req.headers({
  "cache-control": "no-cache",
  "content-type": "application/json"
});

req.type("json");
req.send({
  "author": "Balu",
  "title": "NodeJs Post"
});

req.end(function (res) {
  if (res.error) throw new Error(res.error);

  console.log(res.body);
});

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2021-06-08
    • 2022-01-27
    相关资源
    最近更新 更多