@ArtGMlg

Node.js express приложение, находящееся на хостинге, отправляет ответ со статусом 404?

Есть некоторый apache хост, на нем уже существует один проект с php сервером. Я пытаюсь добавить туда еще один проект, но уже базирующийся на node.js express сервере.
Вот непосредственно файл 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 http = require('http');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users.js');
var loginRouter = require('./routes/login.js');
var tasksRouter = require('./routes/tasks.js');
var groupsRouter = require('./routes/groups.js');
var bodyParser = require('body-parser');
var imageRouter = require('./routes/image.js');
var weatherRouter = require('./routes/weather.js');
var citiesRouter = require('./routes/cities.js');
var sendEmailRouter = require('./routes/email.js');

var app = express();

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

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.use(bodyParser.urlencoded({ extended: true }));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/login', loginRouter);
app.use('/tasks', tasksRouter);
app.use('/groups', groupsRouter);
app.use('/image', imageRouter);
app.use('/weather', weatherRouter);
app.use('/cities', citiesRouter);
app.use('/email', sendEmailRouter);

// 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');
});

http.createServer(app).listen(8080, function() {
  console.log('Listening to port:  ' + 8080);
});

module.exports = app;


И один из рутеров (indexRouter)

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { 
	title: 'Ежедневник',
	tasks: ["1", "2","3","4","asd",]
  });
});

module.exports = router;


Если я указываю в .htaccess файле URL приложения www.example.com, то всё работает как и должно. но если я хочу обращаться к приложению не напрямую, а по адресу www.example.com/my-server, то тут возникают проблемы.

.htaccess файл:
# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN
PassengerAppRoot "/home/hostXXXXXXX/domains/example.com/public_html/my-server"
PassengerBaseURI "/my-server"
PassengerNodejs "/home/hostXXXXXXX/nodevenv/domains/example.com/public_html/my-server/10/bin/node"
PassengerAppType node
PassengerStartupFile app.js
# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END


Если в app.use('/', indexRouter); indexRouter заменить на
function(req, res){
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World\n');
}

то приходит строка Hello World,
в противном же случае приходит строка Cannot GET /my-server/ , а сам статус ответа становится 404
  • Вопрос задан
  • 50 просмотров
Решения вопроса 1
@ArtGMlg Автор вопроса
Итого, решение проблемы оказалось куда более простым чем ожидалось. Чтобы можно было обратиться к приложению и его рутерам, соответственно, находящимся в подкаталоге хостинга, нужно было вместо app.use('/', indexRouter); использовать app.use('/my-server', indexRouter);
Что удивительно, в интернете материала по данному вопросу крайне мало.
Вот ссылка на статью с решением: https://medium.com/better-programming/serving-a-no...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы