【问题标题】:Node js POST method with no response, but works fine at POSTMANNode js POST 方法没有响应,但在 POSTMAN 上工作正常
【发布时间】:2020-06-04 21:59:10
【问题描述】:

我在 localhost:3000 有一个节点应用程序,带有这个 CORS 配置:

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

// Add headers
app.use(function (req, res, next) {

  res.header('Access-Control-Allow-Origin', '*');
  app.use(cors());

  next();
});

这里我有我的发布方法:

router.post('/saveragnarokuser',function(req,res,next){

    console.log('######################### Iniciando saveragnarokuser.');

    UserRagnarokController.addUser(req.body,function(err,count){
        if(err){
            console.log('entrei aqui error: ' + err);
            res.json(err);
        }
        else{

            console.log('entrei aqui ok');

            var userObj = {
                response: "OK"
             };

            res.json(userObj);
        }
    });
});

当我尝试通过 html/javascript 访问此路由时,服务器端控制台会说:

OPTIONS /user-ragnarok-controller/saveragnarokuser/ 200 0.565 ms - 4
######################### Iniciando saveragnarokuser.
myReqbody: {"userid":"bruna","userpass":"teste","email":"acosta.aluiz@gmail.com","sex":"M"}
POST /user-ragnarok-controller/saveragnarokuser/ - - ms - -
entrei aqui ok

这是我的带有 XMLHttpRequest 的 javaScript(客户端)方法:

var invocation = new XMLHttpRequest();

function handler() {
    if(invocation.readyState === XMLHttpRequest.DONE && invocation.status === 200) {
        alert('entrei aqui');
        console.log(invocation.responseText);
    } else 
        alert('nao foi hj');
}

function saveUser() {   
    alert('face');
    var eml = document.getElementById('emailInputRegister');
    var user = document.getElementById('userInputText');
    var sx = document.getElementById("sexInputSelected");
    var selectedSex = sx.options[sx.selectedIndex].value;
    var pwd = document.getElementById("passwordInputRegister");

    var uri = 'http://localhost:3000/user-ragnarok-controller/saveragnarokuser/';
    var body = {
        'userid': user.value,
        'userpass': pwd.value,
        'email': eml.value,
        'sex': selectedSex
    };

    invocation.open('POST', uri, true);

    invocation.setRequestHeader('Content-Type', 'application/json');
    invocation.onreadystatechange = this.handler;
    invocation.send(JSON.stringify(body));
}
}

当我使用 POSTMAN 连接到这条路线时,一切正常。我注意到 POSTMAN 的请求没有连接 OPTIONS 日志

######################### Iniciando saveragnarokuser.
myReqbody: {"userid":"1234658","userpass":"teste","email":"acosta.aluiz@gmail.com","sex":"M"}
entrei aqui ok
POST /user-ragnarok-controller/saveragnarokuser/ 200 10089.318 ms - 17

【问题讨论】:

  • 显示的POST /user-ragnarok-controller/saveragnarokuser/ 400 26.881 ms - 936响应表明对POST请求的响应的HTTP状态码是400 Bad Request错误。这与 CORS 无关,而是表明服务器说请求未按照服务器期望的方式格式化。检查服务器上的服务器日志以查找该 /user-ragnarok-controller/saveragnarokuser/ 端点,并查找那里记录的错误消息,这些消息提供有关请求问题的更具体信息。

标签: javascript node.js xmlhttprequest client-server


【解决方案1】:

查看https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send

invocation.send(body);

下面试试

invocation.send(JSON.stringify(body));

根据我的理解,您的代码正尝试使用 body.toString() 发送请求。

【讨论】:

  • 正文字符串对象发生了一些变化。现在服务正在运行,数据保存在 mySQL 中,但浏览器上的响应仍然相同。在日志服务器响应更改为 OPTIONS /user-ragnarok-controller/saveragnarokuser/ 200 0.565 ms - 4 ######################## Iniciando saveragnarokuser。 myReqbody: {"userid":"bruna","userpass":"teste","email":"acosta.aluiz@gmail.com","sex":"M"} POST /user-ragnarok-controller/saveragnarokuser / - - 小姐 - -。 POST 状态不佳,带有 -- in -- ms