Node.js 和 expressjs paypal ipn 监听器给出错误 500

Posted

技术标签:

【中文标题】Node.js 和 expressjs paypal ipn 监听器给出错误 500【英文标题】:Node.js and expressjs paypal ipn listener gives error 500 【发布时间】:2013-05-24 05:15:50 【问题描述】:

我使用 node.js 和 express 创建了一个 paypal ipn 侦听器。 这是我的监听器代码:

exports.ipn = function(req, res, next) 
    console.log('Paypal');
    var ipn = require('paypal-ipn');
    if(typeof req.body != "undefined") 
        ipn.verify(req.body, function callback(err, msg) 
            if (err) 
                winston.error('IPN: ' + err);
             else 
                if (req.body.payment_status == 'Completed' && msg == "VERIFIED") 
                    winston.info('IPN: ' + msg + " " + req.body.txn_id + " " + req.body.payer_email);
                
            
            res.send(200);
            res.end();
        );
    
    res.send(200);
    res.end();
;

这是我的 expressjs 设置和路线:

    var app = express();

    // all environments
    app.set('port', process.env.PORT || 3000);
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);

    // development only
    if ('development' == app.get('env')) 
      app.use(express.errorHandler());
    

    app.get('/', routes.index);
    app.options('/', routes.options);
    app.post('/', routes.up);
    app.post('/ipn', routes.ipn);

    http.createServer(app).listen(app.get('port'), function()
      console.log('Express server listening on port ' + app.get('port'));
    );

我使用这个模块 https://github.com/andzdroid/paypal-ipn 来验证 ipn 消息,它可以在 paypal ipn 模拟器上正常工作,但是当我尝试实时使用它时,我会将它发送到我的节点控制台:

undefined
POST /ipn 500 351ms

没有其他错误消息,只有这个错误 500 和未定义。有人可以帮我找出这个未定义的变量是什么以及为什么会发生这个错误 500。即使我注释掉侦听器中的所有内容,它也会发生。

编辑:

我将 paypal ipn url 更改为一些我没有定义的随机 url。我仍然得到未定义和错误 500。如果我使用 curl 发布,我应该得到错误 404。

编辑:

我发现如果我像这样使用 curl 发帖:

curl -d "test" -A "-" http://127.0.0.1/randomurl

然后我会收到错误 500。 这给了我 404:

curl -d "test=er" -A "-" http://127.0.0.1/randomurl

【问题讨论】:

【参考方案1】:

我找到了解决方案。 expressjs bodyParser 有问题。我将 expressjs 设置更改为使用 connect 模块的 bodyParser,如下所示:

app.use(require('connect').bodyParser());

【讨论】:

以上是关于Node.js 和 expressjs paypal ipn 监听器给出错误 500的主要内容,如果未能解决你的问题,请参考以下文章

ExpressJS包的用途?

如何在 Node.js expressjs 的异步对象方法中处理未处理的承诺拒绝?

ExpressJS Node.js Angular 错误:获取 OAuth2 API 授权令牌时出现 getaddrinfo ENOTFOUND

我应该在每次使用 ExpressJS/Node 更改时重新启动应用程序服务器吗? [复制]

服务器和客户端上带有 Handlebars.js 的 Node.js

Node js 或 Express js 的基于角色的授权