Nodejs - Express JSON 解析器无法响应

Posted

技术标签:

【中文标题】Nodejs - Express JSON 解析器无法响应【英文标题】:Nodejs - Express JSON parser cannot respond back 【发布时间】:2016-06-24 09:25:29 【问题描述】:

我的问题:一旦我将带有 JQuery 的 JSON 对象提交到使用 JSON 解析器(属于模块 body-parser)的 express 应用程序并尝试回复它,无论是 res.send 还是 res.render,它什么也没做。我尝试将 html 作为 html 响应直接输出回客户端。 另一方面,在我网站的同一页面上,我尝试了常规的正文解析器,并且响应正常。 这是我的 JSON 监听器:

controller.js:

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

var bodyParser = require('body-parser');
var jsonParser = bodyParser.json();
var urlencodedParser = bodyParser.urlencoded( extended:
false ); 

app.post('/video', jsonParser, function(req, res) 
res.send("hi"); //nothing happens

console.log(req.body.time); //works, i get the data
console.log(req.body.src); //works, i get the data
);

提交给它的表单:

index.html

...mywebsite code, uses jquery
fu();

function fu()
    var vid = document.getElementById("vid");
    var time = vid.currentTime;
    var src = vid.currentSrc;
    $.ajax(
        type: "POST",
        url: "/video",
        data: JSON.stringify(time: time, src: src  ), //the data is parsed fine
        dataType: 'json',
        contentType: 'application/json'
    );

    //alert("current time: " + time);
;

现在,我尝试了一个带有正文解析器的简单表单,它在完全相同的网站上运行良好(我把它放在那里只是为了看看它是否可以工作):

controller.js

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

var bodyParser = require('body-parser');
var jsonParser = bodyParser.json();
var urlencodedParser = bodyParser.urlencoded( extended:
false ); 

app.post('/person', urlencodedParser, function(req, res)
    res.send('Thanks!');
    console.log(req.body.firstname);
    console.log(req.body.lastname);    
);

人形:

      <form method="POST" action="/person">
        Firstname: <input type ="text" id="firstname"
        name="firstname"><br>
        Lastname: <input type ="text" id="lastname"
        name="lastname">
        <input type="submit" value="sumbit">
    </form>     

【问题讨论】:

您不必stringify 发送到服务器的数据。试试:data: time: time, src: src 没有stringify是不行的,我刚试过... 我确实工作得很好。至少如果你像我一样安排你的服务器:gist.github.com/Nonemoticoner/366c02f7db613566d3cf 您写了dataType: 'json',但您发送了纯文本作为回复。此外,我相信捕捉对任何变量的响应都会很有用。目前,您的 AJAX 请求对它没有任何作用。 好的,我尝试了没有 stringify 的示例,它可以工作。我可以在控制台上看到数据。但是,仍然没有任何回应。 “嗨”不会出现。 【参考方案1】:

嗯,看起来很简单——你没有在第二个 sn-p 中使用jsonParser——只是urlencodedParser,这里不正确。所以它应该看起来像这里:

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

var bodyParser = require('body-parser');
var jsonParser = bodyParser.json();
var urlencodedParser = bodyParser.urlencoded( extended: false ); 

app.post('/person', jsonParser, function(req, res)
    res.send('Thanks!');
    console.log(req.body.firstname);
    console.log(req.body.lastname);    
);

【讨论】:

不,我的问题在于第一个示例。 “现在,我已经尝试了一个带有身体的简单形式......”之后的所有内容都是我的第二个例子。顺便说一句,第二个示例可以正常工作,无需使用 json 解析器。 好的,所以我不明白send 方法什么都不做是什么意思,您的意思是没有给出响应或浏览器中什么也没发生?因为您在浏览器端没有任何处理程序代码(jQuery 中的done 方法)。 浏览器不显示 res.send 发送的“hi”消息。现在,在我的第二个示例中,它确实显示了它,我的整个网站 html 被“删除”,我看到“谢谢!”【参考方案2】:

$.ajax请求后需要在客户端处理响应。设置done函数处理成功回调:

$.ajax(
        type: "POST",
        url: "/video",
        data: time: time, src: src  ,
        dataType: 'json',
        contentType: 'application/json'
    )
    .done(function( data, status, xhttp) 
         // put the data in the DOM 
         document.getElementById("hi").text(data);
    );

【讨论】:

这就是 ajax 的工作原理,好的。还有其他方法不会直接成功吗?只是为了常识 当然,您可以处理其他选项,例如:errorcomplete。看看这个:api.jquery.com/jquery.ajax 不,我的意思是 - 只需渲染您想要发回的整个页面并将其作为一个整体作为响应发送,不要将其全部作为字符串发送到属于 ajax 的函数中然后决定如何处理它 好吧,AJAX 就是为了做到这一点,发送一些东西而不需要渲染整个页面。如果要渲染整个页面,只需向服务器发出 HTTP 请求并返回视图。【参考方案3】:

你可以尝试用 polyfill "fetch" 代替 jQuery:

function getResponse (url) 
  return fetch(url, 
      method: 'post',
        headers: 
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        ,
        body: JSON.stringify( time, src )
      )
      .then(response => response.json())
      .then(data => 
        console.log('request succeeded with JSON response', data)
      )
      .catch(error => 
        console.log('request failed', error)
      )

我认为它看起来会好很多。它可以在服务器端使用。 文档:https://github.com/github/fetch

【讨论】:

以上是关于Nodejs - Express JSON 解析器无法响应的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS学习笔记——搭建开发框架Express,实现Web网站登录验证

Express定制参数解析错误响应值

[转] Nodejs 进阶:Express 常用中间件 body-parser 实现解析

express-graphql 解析器参数在解析器中为空,但 info variableValues 填充了名称和值

NodeJs GraphQL 片段解析器

nodejs学习笔记二:解析express框架项目文件