Alessandro Minoccheri
Alessandro Minoccheri

Reputation: 35973

Node UnhandledPromiseRejectionWarning

I have a problem with my npm package like this question but I can't figure out how to solve

What is Unhandled Promise Rejection

This is my index.js:

'use strict';
var got = require('got');
var registryUrl = require('registry-url');
var Promise = require('pinkie-promise');

module.exports = function (name) {
    if (typeof name !== 'string') {
        return Promise.reject(new Error('username required'));
    }

    return got.head(registryUrl + name.toLowerCase())
        .then(function (res) {
            return 'test';
        })
        .catch(function (err) {
            if (err.statusCode === 404) {
                err.message = 'Package doesn\'t exist';
            }

            throw err;
        });
};

this is my cli.js

#!/usr/bin/env node
'use strict';
var pkg = require('./package.json');
var info = require('./');
var argv = process.argv.slice(2);
var input = argv[0];

function help() {
    console.log(pkg.description);
    console.log('');
    console.log('Usage');
    console.log('  $ package-info <package-name>');
    console.log('');
    console.log('Example');
    console.log('  $ package-info pageres');
}

if (!input || argv.indexOf('--help') !== -1) {
    help();
    return;
}

if (process.argv.indexOf('-v') !== -1 || process.argv.indexOf('--version') !== -1) {
    console.log(pkg.version);
    return;
}

info(input, function (err, version) {
    if (err) {
        console.error(err);
        process.exit(1);
        return;
    }

    console.log(version);
});

If I try to install locally:

npm install . -g
npm link

Then i change directory and install:

cd ../otherDir
npm install ../my-package

And Launch it

my-package somePackage

I get this:

(node:2145) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): RequestError: getaddrinfo ENOTFOUND function function:80

How can I solve It?

Upvotes: 2

Views: 7854

Answers (1)

Johannes Merz
Johannes Merz

Reputation: 3340

You don't catch your errors in your cli file properly. As a fact, you don't handle the returned promise at all and pass an unused callback. Try changing

info(input, function (err, version) {
    if (err) {
        console.error(err);
        process.exit(1);
        return;
    }

    console.log(version);
});

to

info(input)
.then(version => console.log(version))
.catch(err => {
  console.error(err);
  process.exit(1);
});

This happens because after you catch the error in your info function, you throw it again and further down the chain.

Upvotes: 2

Related Questions