Ошибка HTTP-сервера Hapi | узелJS | UnhandledPromiseRejectionWarning: TypeError: PerfHooks.performance.eventLoopUtilization не является функцией

Я изучаю бэкэнд-разработку с использованием NodeJS с фреймворком Hapi, и у меня возникла ошибка после запуска узла с помощью npm run start.

server.js

const Hapi = require('@hapi/hapi');
const init = async() => {
    const server = Hapi.server({
        port: 5000,
        host: 'localhost',
    });
    await server.start();
    console.info(`Server berjalan pada ${server.info.uri}`);
}
init();

package.json

{
    "name": "hapi-web-server",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "start": "node server.js"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies": {
        "@hapi/hapi": "^21.0.0"
    }
}

Запуск npm run start в PowerShell:

> [email protected] start E:\DOCUMENT\Dicoding\hapi-web-server
> node server.js
(node:19696) UnhandledPromiseRejectionWarning: TypeError: PerfHooks.performance.eventLoopUtilization is not a function
    at new Heavy (E:\DOCUMENT\Dicoding\hapi-web-server\node_modules\@hapi\heavy\lib\index.js:42:60)
    at new module.exports.internals.Core (E:\DOCUMENT\Dicoding\hapi-web-server\node_modules\@hapi\hapi\lib\core.js:122:22)
    at Object.module.exports (E:\DOCUMENT\Dicoding\hapi-web-server\node_modules\@hapi\hapi\lib\server.js:22:18)
    at init (E:\DOCUMENT\Dicoding\hapi-web-server\server.js:4:25)
    at Object.<anonymous> (E:\DOCUMENT\Dicoding\hapi-web-server\server.js:13:1)
    at Module._compile (internal/modules/cjs/loader.js:1251:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1272:10)
    at Module.load (internal/modules/cjs/loader.js:1100:32)
    at Function.Module._load (internal/modules/cjs/loader.js:962:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:19696) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:19696) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Я ожидаю, что вывод должен быть:

Server berjalan pada http://localhost:5000’

И когда я ввожу curl -X GET http://localhost:5000, он должен выдать такой вывод:

{"statusCode":404,"error":"Not Found","message":"Not Found"}

Какую версию узла вы используете? performance.eventLoopUtilization был представлен в версиях узла v14.10.0 и v12.19.0 соответственно. Поэтому, если вы, например, используете узел 14.7 или 12.16, этой функции еще не будет. И @hapi до версии 21 не использовал эту конкретную функцию, поэтому понижение версии решает эту проблему.

derpirscher 12.11.2022 15:33

Моя версия узла v14.8.0. Будет ли решена проблема, если я обновлю свой узел до последней версии? @derpirscher

Owen Lie 13.11.2022 15:08

Да, любая версия узла >= 14.10 будет работать

derpirscher 13.11.2022 15:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно создать начальный маршрут

const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    server.route({
        method: 'GET',
        path: '/',
        handler: function (request, h) {
    
            return 'Hello World!';
        }
    });

    await server.start();
    console.info('Server running on %s', server.info.uri);
};

Я пробовал код, но он все равно выдает то же сообщение об ошибке. TypeError: PerfHooks.performance.eventLoopUtilization is not a function из init();

Owen Lie 12.11.2022 14:19
Ответ принят как подходящий

Проблема может быть решена установкой версии Hapi @hapi/hapi@^20.1.0.

Но это не объясняет, почему приведенный выше код вызывает ошибку в версии Hapi @hapi/hapi@^21.0.0 (последняя версия / по умолчанию от npm install @hapi/hapi)

Редактировать

Пояснение от derpirscher:

performance.eventLoopUtilization был представлен в версиях узла v14.10.0 и v12.19.0 соответственно. Поэтому, если вы, например, используете узел 14.7 или 12.16, этой функции еще не будет. И @hapi до версии 21 не использовал эту конкретную функцию, поэтому понижение версии решает эту проблему.

Моя версия узла v14.8.0
Вот что вызывает проблему.

Узнав о проблеме, я попытался установить @hapi/hapi и nvm до последней версии, и проблема была решена.

Я также узнал, что поддерживать версию узла проще с NVM для Windows.

Другие вопросы по теме