heroku 节点服务器不会运行

Posted

技术标签:

【中文标题】heroku 节点服务器不会运行【英文标题】:heroku node server won't run 【发布时间】:2019-04-03 12:10:55 【问题描述】:

嗨,我用 nodeJS 制作了一个伪造查看器并在本地运行,当我尝试在 heroku 上部署时,它在检查器中返回“无法获取”,它发送 “加载资源失败:服务器响应状态为 404 (未找到)”

index.js 是我的根,当键入“npm start”时它调用我的 index.html

    var path = require('path');
const express = require('express');

const PORT = process.env.PORT || 3000;
const config = require('./config');
if (config.credentials.client_id == null || config.credentials.client_secret == null) 
    console.error('Missing FORGE_CLIENT_ID or FORGE_CLIENT_SECRET env. variables.');
    return;


let app = express();
app.use( express.static(path.join(__dirname, '/public')));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.json( limit: '50mb' ));
app.use('/api/forge/oauth', require('./routes/oauth'));
app.use('/api/forge/oss', require('./routes/oss'));
app.use('/api/forge/modelderivative', require('./routes/modelderivative'));
app.use((err, req, res, next) => 
    console.error(err);
    res.status(err.statusCode).json(err);
);
app.listen(PORT, () =>  console.log(`Server listening on port $PORT`); );

config.js,在这里我把我的日志信息放到 autodeskforge

    // Autodesk Forge configuration
module.exports = 
    // Set environment variables or hard-code here
    credentials: 
        client_id: process.env.FORGE_CLIENT_ID || 'xxxxxx',
        client_secret: process.env.FORGE_CLIENT_SECRET || 'xxxxxx',
        callback_url: process.env.FORGE_CALLBACK_URL || 'https://nodeforge.herokuapp.com/api/forge/callback/oauth'
    ,
    scopes: 
        // Required scopes for the server-side application
        internal: ['bucket:create', 'bucket:read', 'data:read', 'data:create', 'data:write'],
        // Required scope for the client-side viewer
        public: ['viewables:read']
    
;

这是运行 JS 文件的“公共”目录中的我的 index.html。

 <!DOCTYPE html>
<html>
<head>
  <title>Autodesk Forge</title>
  <meta charset="utf-8" />
  <!-- Common packages: jQuery, Bootstrap, jsTree -->
  <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
  <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
  <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
  <!-- Autodesk Forge Viewer files -->
  <link rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/style.min.css?v=v6.0" type="text/css">
  <script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/viewer3D.min.js?v=v6.0"></script>
  <!-- this project files -->
  <link href="css/main.css" rel="stylesheet" />
  <script src="js/ForgeTree.js"></script>
  <script src="js/ForgeViewer.js"></script>
</head>
<body>

  <div class="container-fluid fill">
    <div class="row fill">
      <div class="col-sm-4 fill">
        <div class="panel panel-default fill">
          <div class="panel-heading" data-toggle="tooltip">
            Buckets &amp; Objects
            <span id="refreshBuckets" class="glyphicon glyphicon-refresh" style="cursor: pointer"></span>
            <button class="btn btn-xs btn-info" style="float: right" id="showFormCreateBucket" data-toggle="modal" data-target="#createBucketModal">
              <span class="glyphicon glyphicon-folder-close"></span> New bucket
            </button>
          </div>
          <div id="appBuckets">
            tree here
          </div>
        </div>
      </div>
      <div class="col-sm-8 fill">
        <div id="forgeViewer"></div>
      </div>
    </div>
  </div>
  <form id="uploadFile" method='post' enctype="multipart/form-data">
    <input id="hiddenUploadField" type="file" name="theFile" style="visibility:hidden" />
  </form>
  <!-- Modal Create Bucket -->
  <div class="modal fade" id="createBucketModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-label="Cancel">
            <span aria-hidden="true">&times;</span>
          </button>
          <h4 class="modal-title" id="myModalLabel">Create new bucket</h4>
        </div>
        <div class="modal-body">
          <input type="text" id="newBucketKey" class="form-control"> For demonstration purposes, objects (files) are 
          NOT automatically translated. After you upload, right click on
          the object and select "Translate".
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
          <button type="button" class="btn btn-primary" id="createNewBucket">Go ahead, create the bucket</button>
        </div>
      </div>
    </div>
  </div>
</body>
</html>

【问题讨论】:

1.您是否验证了所有文件和文件夹在服务器上的顺序与您在本地的顺序相同? 2.运行 nodejs 应用程序时控制台上是否有任何错误消息? 我不知道如何验证该文件夹,但如果它像 github,我认为一切都在 heroku 上,尊重路径,nodejs 应用程序在本地运行没有任何错误我会发送图片 我编辑了主题并添加了应用图片 你在哪里渲染你的 index.html?从您的 index.js 中不清楚 【参考方案1】:

我看到您正在遵循教程材料,但您似乎做出了可能导致您遇到的问题的更改。

首先,根本没有提到 index.js 文件,我们使用的是 start.js 文件,它初始化节点服务器以及调用 npm start 的时间,heroku 也会调用这个命令,如果你检查package json 文件,你会看到 npm start 正在调用 node start.js。

其次,我看到一些提到了ejs,但我认为教程没有提到它,你是否需要或对html模板进行了一些更改才能使用ejs?

此外,最好的做法是永远不要显示您的 API 密钥,特别是在 Stack Overflow 等数百万开发人员会看到它的地方,我建议禁用这些密钥并创建新的密钥,以避免其他用户使用您的积分。

我会说再次检查此部分http://learnforge.autodesk.io/#/environment/setup/nodejs_2legged

我们已经多次将本教程部署到 Heroku 上,没有任何问题,通常解决任何问题的方法是按照预期的方式一步一步地按照说明进行操作。您也可以随时下载项目的整个源代码并将其与您的源代码进行比较。

【讨论】:

您的代码是否托管在某个地方以便我查看? 我在本地进行了测试,没有发现 Backnode 项目有任何问题。您是否在 Heroku 设置中传递 ENV Vars 以获取 Forge 客户端 ID 和 Secret 的值?

以上是关于heroku 节点服务器不会运行的主要内容,如果未能解决你的问题,请参考以下文章

Heroku git push 不更新节点模块

Heroku节点应用程序未启动

让 Heroku 运行非主 Git 分支

Heroku无法运行节点ES6代码

节点 js heroku 中 pem 文件的密钥

peerjs 在 loaclhost 上工作,但不在 heroku 上?