【问题标题】:nodeJs returning QUOTED string instead of plain text using lambda AWSnodeJs 使用 lambda AWS 返回 QUOTED 字符串而不是纯文本
【发布时间】:2018-09-06 16:38:20
【问题描述】:

nodejs 函数应该返回 text/csv,但返回的是带有嵌入换行符 \n 的引号字符串,而不是真正的换行符。

使用拦截器接收响应中的标头,它正确说明 内容类型:文本/csv 对于像 GET /tst/items/name HTTP/1.1 这样的请求 nodejs sn -p 是

 const Json2csvP = require('json2csv').Parser;
 const fields = ['f1','f2','f3'];
var searchQ =['select * from names'];
 await db.any(searchQ[0])
        .then(function(data) {
           const json2csvP = new Json2csvP({ fields, quote: '', eol: '\n' });
            console.log(csv);
            callback(null, (csv));
        })

所以对于 AWS 输出中的控制台响应就像

"field1, field2 field3\n1  2  3"

浏览器/REST 工具中的调用者获取它

"field1, field2 field3\n1  2  3"

但我在被调用方查看以下 csv 格式

field1 field2 field3
1  2   3

请注意,没有引号,并且在没有 html 的纯文本中使用真正的新行而不是 \n 字符。我确实尝试过使用 .split,如下所示

 callback(null, (csv).split(/\n/g));

仅在 AWS 响应结果中给出真正的换行符 ["字段 1 字段 2 字段 3", "1 2 3"]

但不是所需的格式(两行中都没有引号),对于调用者/浏览器/REST 工具,它给出的格式如下所示,没有换行符,带有引号和额外的不想要的 [ 和 ] 字符,如下所示。

["field1 field2 field3", "1  2   3"]

来电者如何收到以下信息?

field1 field2 field3
    1  2   3

【问题讨论】:

  • 一切都很好。 AWS 控制台正在打印 "field1, field2 field3\n1 2 3" 可能是因为它对字符串进行 JSON 编码。该文本表示背后的数据您的想法(没有引号,带有“真实”换行符)。在 Node.js 中尝试以下操作:var fs = require('fs'); var csv = "field1, field2 field3\n1 2 3"; fs.writeFileSync('out.csv', csv);,然后查看 out.csv。它符合您的期望。一切都很好。
  • 感谢 Ahmed,这方面还有更多内容,对于像 REST 客户端这样期望数据格式为所需格式的调用者来说,这是不合适的。该文件无需在浏览器中使用 fs lib 就可以下载(请参阅响应的标题,它是 text/csv),当我在记事本和记事本++中打开它时,输出是一个带有嵌入换行符的带引号的字符串。在浏览器(chrome)中,页面显示带有嵌入 \n 字符的引用字符串。 java 或 c# 中的相同代码给出了预期的结果,但在 nodejs 中,上面的代码看起来缺少一些东西。
  • 我明白了,然后试试JSON.parse(theWeirdString),它应该会给你一个简单编码的字符串。
  • 是的,我试过 JSON。解析它给出了null。
  • 您的 Lambda 函数将您的输出字符串作为 JSON 字符串 返回,因为这是 Lambda 函数始终返回的内容——某种 JSON。听起来您正在使用 API Gateway,在这种情况下,您应该使用 Lambda Proxy Integration,因为响应 JSON 对象由 API Gateway 反序列化,并且来自响应对象的 body 字符串将返回到调用者,它看起来和你期望的完全一样。

标签: node.js amazon-web-services aws-lambda


【解决方案1】:

我确实尝试了许多用于解析、csv 和流等的 nodejs 模块来获得所需的输出,但都没有工作。输出总是字符串化的。

根据 AWS 文档, 好像是nodejs和aws结合的限制https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

result – 是一个可选参数,您可以使用它来提供 成功执行函数的结果。提供的结果必须是 JSON.stringify 兼容。如果提供错误,则此参数为 忽略

结合使用 java 和 Aws 没有此限制。 https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-handler-types.html

outputType – 如果您计划同步调用 Lambda 函数 (使用 RequestResponse 调用类型),可以返回输出 使用任何受支持的数据类型的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2018-02-28
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多