如何在AWS lambda中响应非拉丁字符?

10月12日更新:

这个问题现在已经解决了。 有关详细信息,请参阅aws论坛中的此帖 。


我写了一个nodejs函数,只是用一些汉字回复。 但它以错误的字符回应。

exports.handler = function(event, context) { context.succeed('Hello 世界!'); }; 

函数结果变成:

 "Hello             !" 

当我写一个函数来parsing一些中文网站并检索他们的页面标题时,我遇到了这个问题。 我设法把它们转换成utf-8(我用这个请求),console.log(标题)正确显示这些汉字。 但context.succeed()的结果如上例所示。 在回应结果时,我应该怎样处理这些非拉丁字符呢?

来自AWS支持(2015年8月10日):

感谢您使用关于Lambda和UTF-8的问题向AWS Support寻求帮助。

目前我们正在研究这个问题,因为其他客户已经提请我们注意。 当这个问题得到解决或者我们可以解决这个问题的时候,还没有eta。

正如在AWS文档 – 编程模型(Node.js)中一样 :

指示Lambda函数执行,所有callback已成功完成。 这里是一般的语法:

 context.succeed (Object result); 

哪里

对象result – 提供函数执行的结果。 提供的结果必须是JSON.stringify兼容的。 该参数是可选的。 你可以不带任何参数调用这个方法( succeed() )或者传递一个null值( succeed(null) )。 如果AWS Lambda无法进行string化或遇到另一个错误,则会引发未处理的错误,并将X-Amz-Function-Error响应头设置为“未处理”。

所以,你不能得到这样的结果:

 Hello 世界! 

因为,stringHello 世界! 将被编码为JSON。 那么,它会返回:

 "Hello 世界!" 

如果您在使用AWS Lambda Console的浏览器中看到以下内容:

 "Hello       !" 

结果的十六进制视图

其实这是一个有效的JSON ,你只需要解码它,然后处理它。

尝试运行这个:

 exports.handler = function (event, context) { var jsonStr = JSON.stringify('Hello 世界!'); console.log(jsonStr); console.log(JSON.parse(jsonStr)); context.succeed('Hello 世界!'); }; 

日志结果将是:

 2015-08-07T12:49:54.888Z 12345678-90ab-cdef-1234-567890abcdef "Hello 世界!" 2015-08-07T12:49:54.889Z 12345678-90ab-cdef-1234-567890abcdef Hello 世界! 

解码之后,你可以找回原来的string。