【发布时间】: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