在Heroku上运行NodeJS服务器

时间:2014-07-04 17:05:24

标签: node.js heroku

我刚刚通过入门指南(https://devcenter.heroku.com/articles/getting-started-with-nodejs)在Heroku上安装了一个NodeJS服务器,我想我已经正确地完成了所有步骤。

但是,当我转到heroku(http://secure-caverns-6779.herokuapp.com/)生成的url时,它会显示一个Application Error。我不知道这是否是我写的.js服务器的预期行为,但无论如何它都没有做我想要的。

这就是我想要在localhost上正确测试的地方:

  1. 从网页中,向NodeJS服务器发送一些get请求。

  2. 从NodeJS服务器调用MongoDB数据库。

  3. (从NodeJS服务器,将一些数据发送回另一个服务,但这不重要)

  4. 这是我上传到Heroku并在本地测试的server.js文件没有问题(为简洁起见省略了一些部分):

    var http = require("http"),
        url = require('url'),
        req = require("request"),
        qs = require('querystring'),
        async = require("async"),
        mongojs = require("mongojs"),
        JSONStream = require('JSONStream'),
        open = require('open'),
        webURI = "[web uri here]";
    
    var uri = "[mongoDB uri here]",
        db = mongojs.connect(uri, ["db_name"]);
    
    var server = http.createServer(requestHandler);
    
    ...some functions (example below)...
    
    function addTrack(post,callback){
        var partyId = post['partyId'], trackId = post['trackId'];
        db.db_name.update({id: parseInt(partyId)}, { $push: { tracks: trackId } }, function(err, added) {
            if( err || !added ) {
                console.log("Track could not be added.");
                callback(null,added);
            }
            else {
                console.log("Track("+trackId+") added to Party("+partyId+")");
                callback(null,added);
            }
        });
    }
    
    function requestHandler(request, response) {
        response.setHeader('Access-Control-Allow-Origin', '*');
        response.writeHead(200, {"Content-Type": "application/json"});
        var pathname = url.parse(request.url, true).pathname;
        switch (true) {
    
            ...some switch cases...
    
            case request.method === 'POST' && /\/addTrack/.test(pathname):
                var body = '';
                request.on('data', function (data) {
                    body += data;
                    // Too much POST data, kill the connection!
                    if (body.length > 1e6)
                        req.connection.destroy();
                });
                request.on('end', function () {
                    var post = qs.parse(body);
                    addTrack(post, function(err, added) {
                        response.write(JSON.stringify({ status: added }));
                        response.end();
                    });
                });
                break;
    
        }
    }
    
    var port = Number(process.env.PORT || 5000);
    server.listen(port, function() {
        console.log("Listening on " + port);
    });
    

    所以,重申一下,我在本地测试了这个server.js,一切正常。现在我将它上传到Heroku后进行测试(完成所有步骤,包括创建Procfile和package.json等)并且它不起作用。我用来发送GET / POST请求的网址是:http://secure-caverns-6779.herokuapp.com/我认为是server.js应该是什么。注意我不希望server.js创建一个网页或其他任何东西,只处理与MongoDB数据库的调用和通信。

    我从本地网页到NodeJS服务器的示例jquery GET请求如下:

    $.get("http://127.0.0.1:8888/server.js/trackAdded", "partyId=" + partyId + "&trackId=" + value.id, function (json) {
         ...
    }, 'json');
    

    这里的错误是什么,我应该采用不同的网址,也许添加一个端口?添加" / server,js"到网址?

    亲切的问候,

2 个答案:

答案 0 :(得分:1)

使用" heroku日志"在您从中将项目部署到heroku的控制台中,并找到一个表示存在错误的位置:)

答案 1 :(得分:0)

根据您的说法,Heroku应该已经将您的基本网址http://127.0.0.1:8888/替换为http://secure-caverns-6779.herokuapp.com/

因此,如果http://127.0.0.1:8888/server.js/trackAdded在本地运行,http://secure-caverns-6779.herokuapp.com/server.js/trackAdded也应该有效。我在这里测试了它并返回一个json对象:

{"status":0}