сервер hapi : когда я запрашиваю методом POST, сервер hapi отвечает нулем, но отлично работает на локальном хосте

#nginx #amazon-ec2 #reverse-proxy #joi #hapi

Вопрос:

использование сервера hapi-v = 16,7 joi -v = 10,6, развернутого в aws ec2, обратный прокси-сервер nginx

Серверный код в server.js:

 'use strict';

//let newrelic = require('newrelic');
let Hapi = require('hapi');
let Routes = require('./Routes');
let Plugins = require('./Plugins');
let Bootstrap = require('./Utils/BootStrap');
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
const Inert = require('inert');
const Vision = require('vision');
const HapiSwagger = require('hapi-swagger');
const Pack = require('./package');
const Config = require('./Config');
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;


const server = new Hapi.Server();



server.connection({
    port: Config.dbConfig.config.PORT,
    routes: {cors: true}
});

let mongoOpts = {
    reconnectTries: 60,
    reconnectInterval: 2000,
    useMongoClient:true
};
mongoose.connect(Config.dbConfig.config.dbURI,mongoOpts, (err, res) => {
    if (err) {
        console.log("DB Error: ", err);
        process.exit(1);
    } else {
        console.log('MongoDB Connected');
        
    }
});

server.register([
    Inert,
    Vision,
    {
        'register': HapiSwagger,
        'options': {
            info: {
                'title': Config.dbConfig.config.SWAGGERNAME,
                'version': Pack.version,
                description: '',
            },
           
            //documentationPath: '/',
            tags:[
                {
                    name: 'v2.1.0',
                    description: 'API'
                }
            ],
            grouping: 'tags',            
        },
    }], (err) => {
    server.start((err) => {
        if (err) {
            console.log("Server err----------->", err);
        } else {
            console.log('Server running at:', server.info.uri);
        }
    });
});


server.on('response', (request) => {console.log('response===>>>:');
    if(request.url.path.startsWith('/panel')){
    }
    else {//console.log('HEADERS===========>:',request.headers);
        /* console for checking the params in the request*/
        console.log(request.info.remoteAddress   ': '   request.method.toUpperCase()  
            ' '   request.url.path   ' --> '   request.response.statusCode);
        console.log('Request payload:', request.payload);
    }
});

process.on('uncaughtException', function (err) {
    console.log(err);
});



server.register(Plugins, function (err) {
    if (err) {
        server.error('Error while loading plugins : '   err)
    } else {
        server.log('info', 'Plugins Loaded')
    }
});

server.register(Inert, function (err) {
    if (err) {
        throw err;
    }
    server.route(Routes);
});

server.route([
  

    {
        method: 'GET',
        path: '/{param*}',                      /* show error page */
        handler: function (req, res) {
            res.file('./error.html')
        }
    },

    {
        path: "/panel/{path*}",
        method: "GET",
        handler: {                              /* open admin panel index from panel path*/
            directory: {
                path: ['./_admin'],
                listing: false,
                index: ['index.html']
            }
        }
    }
]);
 

Это развернуто в AWS-EC2 с обратным прокси-сервером Nginx.Когда мы отправляем запрос с полезной нагрузкой, он отлично работает в localhost и сохраняет данные в MongoDB. Но когда мы применяем тот же метод POST из другого домена к развернутому серверу ec2, в журналах pm2 отображается следующая ошибка. Похоже, что он отвечает нулем перед запуском контроллера.

Ошибка в журналах pm2, когда мы нажимаем метод POST:

 TypeError: Cannot read property 'statusCode' of null
at /var/www/html/vhosts/custom_BE_ecommerce/api/server.js:123:65
at Object.internals.handler (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:283:33)
at invoke (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:255:23)
at each (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:259:13)
at Object.exports.parallel (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/items/lib/index.js:70:13)
at Object.internals.emit (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:276:18)
at module.exports.internals.Server.internals.Podium._emit (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:156:15)
at each (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:197:47)
at Object.exports.parallel (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/items/lib/index.js:70:13)
at relay (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:198:15)
at Object.internals.emit (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:202:16)
at internals.emitEmitter (/var/www/html/vhosts/custom_BE_ecommerce/api/node_modules/podium/lib/index.js:303:15)
at processTicksAndRejections (node:internal/process/task_queues:79:21)
 

Нужна помощь в этом вопросе.

Комментарии:

1. Похоже , что ошибка исходит из строки, в которой вы request.response.statusCode находитесь, внутри обработчика response событий. В документации к response событию говорится: «Тип события» ответ » выдается после отправки ответа клиенту (или когда клиентское соединение закрыто и ответ не отправлен, в этом случае request.response null )». Похоже, что клиентское соединение закрывается преждевременно, что может указывать на то, что в конфигурации NGINX что-то не так. Я предлагаю проверить журналы NGINX.

2. @SethHolladay Я попытался с самого сервера ec2 curl --location --request POST 'http://localhost:8000/test' , хотя от приложения не последовало ответа.