【问题标题】:Unable to connect error - Node Express app on Linux server无法连接错误 - Linux 服务器上的 Node Express 应用程序
【发布时间】:2020-01-07 11:46:45
【问题描述】:

尝试连接到 Node Express 应用程序时,我在浏览器中收到“无法连接”错误。在(我的服务器 IP 地址)1.1.1.1:5000。该应用程序在我的开发环境中运行良好,但在我的 AWS EC2 Linux 服务器上运行良好。

  • Node Express 应用在我的计算机上运行在 dev 中
  • 端口 5000 允许传入 TCP。我用一个较小的应用程序 (https://hackernoon.com/deploying-a-node-app-on-amazon-ec2-d2fb9a6757eb) 测试并确认了这一点。
  • 我确认我的 Node Express 应用程序正在运行。 (我正在使用 pm2)
  • PM2 一直在 ~14 秒重新启动我的 Node Express 应用程序
  • 我试图从我的机器 curl 访问端口 5000,我收到一个连接被拒绝错误curl: (7) Failed to connect to 1.1.1.1 port 5000: Connection refused

更新

  • 我没有使用pm2 start app.js 启动应用程序,而是使用npm start 启动它,并且我成功地将应用程序托管在端口5000 上。
  • 我可以去 1.1.1.1:5000 并返回API is running
  • 我使用 js fetch api 在 127.0.0.1:5000 调用后端并收到Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1:5000/pickTicket/21780482. (Reason: CORS request did not succeed). 2 TypeError: NetworkError when attempting to fetch resource.(*注意:我的 api 与我的 nginx/react 应用在同一台服务器上)`

我的应用程序以 app.js 开头

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require('cors');
var compression = require('compression');
var fetch = require('node-fetch');

var pickTicketRouter = require('./routes/pickTicket');
var kdlRouter = require('./routes/kdl')

console.log('Creating API')
var app = express();
app.use(cors());
app.options('*', cors());

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(compression());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.get('/', (req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('API is running\n');
});

app.use('/pickTicket', pickTicketRouter);
app.use('/kdl', kdlRouter)

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

/bin/www

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('api:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '5000');
console.log('Listening on port: ', port);
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

package.json

{
  "name": "api",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "dev": "nodemon ./bin/www"
  },
  "dependencies": {
    "compression": "^1.7.4",
    "cookie-parser": "~1.4.4",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "forever": "^1.0.0",
    "http-errors": "~1.6.3",
    "jade": "~1.11.0",
    "morgan": "~1.9.1",
    "mssql": "^5.1.0",
    "node-fetch": "^2.6.0",
    "sequelize": "^5.11.0",
    "tedious": "^6.2.0"
  },
  "devDependencies": {
    "nodemon": "^1.19.1"
  }
}

我希望看到来自 api 的响应,但却收到了 CORS 错误。

【问题讨论】:

  • 您的实例IP是1.1.1.1?这是怎么发生的?
  • @MilanVelebit 这是一个例子
  • 错误已修复,错误万岁
  • 查看debug 的文档,您可以使用DEBUG=\"app:*\" 仅显示您的应用程序错误/调试,*: 也应该显示 express 的所有内容
  • np,很高兴它有帮助。旁注,如果使用 pm2,请不要认为您需要 "forever": "^1.0.0",。也不要忘记你可以pm2 monit 看看为什么事情会崩溃,虽然不要让它运行日志没有尾随时间会填满锤子内存,它使用祝福这很确定内存泄漏就像buggery

标签: node.js linux express


【解决方案1】:

我在 app.js 上调用 pm2 start 而不是 bin/www

【讨论】:

    【解决方案2】:

    我有几个关于不同环境的问题。您的 DEV 环境是否托管在 AWS 中?如果没有,我会查看 AWS 安全组以确保为您的应用程序提供正确的 TCP 协议。

    另外,您是将该 EC2 部署到默认 VPC 中还是创建了您自己的 VPC? 如果您创建了 VPC,则可能是路由问题或网络级别问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2021-11-08
      • 2021-04-22
      • 1970-01-01
      • 2019-10-08
      相关资源
      最近更新 更多