从node.js

时间:2016-10-13 18:28:23

标签: javascript python json node.js restify

我是一名学习python的JS开发人员。这是我第一次尝试同时使用node(v6.7.0)和python(v2.7.1)。我正在使用python-runner作为我的python virtualenv的桥梁。我的python脚本使用RAKE NLP关键字提取包。

我无法弄清楚为什么我的 server.js 中的返回数据在字符8192处插入一个随机逗号,大概是其倍数。除了位置之外没有任何模式;有时它在值中的其他时间位于对象键字符串的中间,在逗号分隔对象对之后的其他时间。这完全打破了返回数据上的JSON.parse()。示例输出如下。当我从python shell运行脚本时,这不会发生。

我真的无法弄清楚为什么会这样,任何经验丰富的开发者都有任何想法?

浏览器中的示例输出

[..., {...ate': 1.0, 'intended recipient': 4.,0, 'correc...}, ...]

python shell中的示例输出

[..., {...ate': 1.0, 'intended recipient': 4.0, 'correc...}, ...]

不遵守以下文件中关于对象转换和处理的任何不同意见。该守则已被简化为显示问题

server.js

var restify = require('restify');
var py = require('python-runner');

var server = restify.createServer({...});

server.get('/keyword-extraction', function( req, res, next ) {

    py.execScript(__dirname + '/keyword-extraction.py', {
        bin: '.py/bin/python'
    })
    .then( function( data ) {
        fData = JSON.parse(data); <---- ERROR
        res.json(fData);
    })
    .catch( function( err ) {...});

    return next();
});

server.listen(8001, 'localhost', function() {...});

keyword-extraction.py

import csv
import json
import RAKE

f = open( 'emails.csv', 'rb' )
f.readline() # skip line containing col names

outputData = []

try:
    reader = csv.reader(f)

    for row in reader:
        email = {}
        emailBody = row[7]

        Rake = RAKE.Rake('SmartStoplist.txt')

        rakeOutput = Rake.run(emailBody)        

        for tuple in rakeOutput:

            email[tuple[0]] = tuple[1]

        outputData.append(email)

finally:
    file.close()

    print( json.dumps(outputData))

1 个答案:

答案 0 :(得分:1)

这看起来很像一个与某个缓冲区大小相关的错误,因为8192是2的幂。

这里最重要的是准确隔离发生故障的位置。如果我正在调试这个,我会

  1. 仔细查看json.dumps的输出,在位置8191的两侧打印几个字符,最好是整数字符代码(unicode,ASCII或其他)。

  2. 如果看起来没问题,我会尝试将python脚本的输出捕获为文件并直接在节点服务器中读取(即不运行python脚本)。

  3. 如果可行,那么创建一个python脚本,该脚本接受该文件并在不进行操作的情况下输出它,让节点服务器执行该python脚本而不是现在使用的脚本。

  4. 这应该可以帮助您找出问题发生的位置。从评论中,我怀疑这本质上是一个你无法控制的错误,除非你可以增加python缓冲区大小,以保证你的数据永远不会破坏缓冲区。 8K非常小,所以这可能是一个现实的解决方案。

    如果这不合适,那么您可以考虑在节点服务器上处理数据,以删除n * 8192处的每个字符,如果您可以始终如一地依赖它。祝好运。