【问题标题】:Hapi - reply JSON onlyHapi - 仅回复 JSON
【发布时间】:2019-10-21 15:15:42
【问题描述】:

如何调整 Hapi 回复功能,使其仅回复 JSON 对象? 我应该把它简单地发送并发送吗?好像没找到好例子

这是一些编辑 - 添加了一些示例代码以了解正在发生的事情。

路线:

server.route({
    method: 'GET',
    path: '/user/',
    handler: function (request, reply) {

        var ids = null;

        mysqlConnection.query('SELECT ID FROM Users;',function(err,rows,fields){
            if(err) throw err;
            ids = rows;
            // console.log(ids);
            reply(ids);
        });    
    }
});

回复:

<html><head></head><body>
<pre style="word-wrap: break-word; white-space: pre-wrap;">[{"ID":1},{"ID":2},{"ID":3},{"ID":4},{"ID":5},{"ID":6},{"ID":7},{"ID":8},{"ID":9},{"ID":10},{"ID":11},{"ID":12},{"ID":13},{"ID":14},{"ID":15},{"ID":16},{"ID":17},{"ID":18},{"ID":19},{"ID":20},{"ID":21}]
</pre></body></html>

【问题讨论】:

  • 旁注。没有“JSON 对象”。 JSON 始终是一个字符串。你可以通过解析把它变成一个对象。在那之后,它不再是 JSON。
  • 我猜?您的浏览器正在转换 JSON 以进行显示。 Hapi 应该返回一个 JSON 字符串,如图所示。
  • 是的,浏览器把它包起来了……

标签: node.js hapijs


【解决方案1】:

我希望我能理解这个问题。我们在谈论版本 8.x 吗?对我来说,这似乎是默认值。将此代码用作路由处理程序,

folders: {
    handler: function( request, reply ) {

        'use strict';
        reply({
            folders: folders
        }).code( 200 );

    }
},

做事

curl http://localhost:3001/folders

我得到以下输出

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3001 (#0)
> GET /folders HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:3001
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: application/json; charset=utf-8
< cache-control: no-cache
< content-length: 266
< accept-ranges: bytes
< Date: Tue, 03 Feb 2015 23:19:31 GMT
< Connection: keep-alive
<
{folders ..... }

另外,请注意我只打电话给reply()而不是return reply()

HTH

【讨论】:

【解决方案2】:

至于 v17 及以上版本,reply() 接口被移除。现在处理程序使用异步函数,您可以只返回值。

来自hapi docs 示例:

// Before
const handler = function (request, reply) {
    return reply('ok');
};

// After
const handler = function (request, h) {
    return 'ok';
};

【讨论】:

    【解决方案3】:

    使用 hapi 的 reply(data) 并传递 data 对象将为您完成工作。在内部,hapi 将为您的数据对象创建适当的 JSON 并对其进行响应。

    how to reply JSON for a given request using hapi 上有一个教程可能会提供更多见解。

    【讨论】:

      【解决方案4】:

      使用 v17 及更高版本,仅返回裸字符串不会导致 json 编码回复。 使用 return JSON.stringify() 确保字符串是 json 编码的

      例如

      function (request, h) {
          return JSON.stringify('ok');
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 2015-01-17
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 2020-02-11
        相关资源
        最近更新 更多