【问题标题】:Running NodeJS server on Heroku在 Heroku 上运行 NodeJS 服务器
【发布时间】:2014-08-26 01:03:28
【问题描述】:

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

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

这是我想要做的,并在 localhost 上正确测试:

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

  2. 从 NodeJS 服务器对 MongoDB 数据库进行一些调用。

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

这是我上传到 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 请求的 url 是: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');

这里有什么错误,我应该采用不同的 url,添加一个端口吗?在 url 中添加“/server,js”?

亲切的问候,

【问题讨论】:

    标签: node.js heroku


    【解决方案1】:

    根据您所说,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}
    

    【讨论】:

    • 确实,我问这个问题太快了。不管怎样,谢谢:)
    【解决方案2】:

    在您将项目部署到 heroku 的控制台中使用“heroku 日志”,并查找显示错误的地方 :)

    【讨论】:

    • 哦,这真的很有帮助。看起来它确实收到了请求,并且实际上非常活跃。我只是想,因为它显示了它没有做任何事情的错误。谢谢,是时候进行一些调试了!
    • 没问题,竖起大拇指对我真的很有帮助,因为我也需要积极的活动来提问:)(问了几个愚蠢的问题,我因此受到了惩罚:D)
    • 哈哈没问题,其实我也问了一个愚蠢的问题,因为一切似乎都运行得很完美!我只是认为这不会导致我看到应用程序错误页面并吓坏了:P
    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 2018-04-18
    • 2020-08-13
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2022-01-11
    相关资源
    最近更新 更多