8 votes

Obtention d'une erreur de type [ERR_UNKNOWN_FILE_EXTENSION] : Extension de fichier inconnue "" pour D:\Projects\matri -Site \bin\www pour Node Js v14

Je suis nouveau à Node js et j'ai quelques problèmes. Auparavant, j'utilisais node Js v13.8 pour exécuter mon application express et cela fonctionnait très bien. J'utilisais la syntaxe es6 et le module type avec des fichiers d'extension JS. Mais, lorsque j'ai mis à jour vers Node 14.1.0. Il affiche l'erreur suivante (même erreur avec la version 13.9).

TypeError [ERR_UNKNOWN_FILE_EXTENSION] : Extension de fichier inconnue "" pour D:\Projects\matri -Site \bin\www .

Voici mon extrait d'erreur

De nouveau, lorsque j'ai rétrogradé vers Node 13.8, cela fonctionne bien.

Voici mon fichier package.json :

{
  "name": "matri-site",
  "version": "0.0.0",
  "private": true,
  "type": "module",
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "bcryptjs": "^2.4.3",
    "buffer": "^5.5.0",
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "4.16.1",
    "handlebars": "^4.7.6",
    "http-errors": "~1.6.3",
    "jade": "~1.11.0",
    "jsonwebtoken": "^8.5.1",
    "mongoose": "^5.8.9",
    "morgan": "~1.9.1",
    "nodemailer": "^6.4.2",
    "redis": "^3.0.2",
    "validator": "^12.1.0",
    "validatorjs": "^3.18.1"
  },
  "devDependencies": {
    "eslint": "^6.8.0"
  }
}

Voici mon fichier WWW :

#!/usr/bin/env node

/**
 * Module dependencies.
 */

// var app = require('../app');
// var debug = require('debug')('matri-site:server');
// var http = require('http');

import app from '../app.js';
import debug from "debug";
 debug.debug('matri-site:server');
import http from "http";

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

var port = normalizePort(process.env.PORT || '3000');
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);
}

16voto

Hin Fan Chan Points 778

La cause réelle est due à la nouvelle spécification sur le support ESM. C'est-à-dire que le fichier qui contient #!/usr/bin/env node nécessite une prolongation lorsque "type": "module" . L'ESM natif nécessite .js pour identifier s'il s'agit d'ESM (vous devez spécifier l'extension .cjs si votre code est écrit en commonjs), c'est pourquoi il se plaignait de la présence de TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ""

En d'autres termes, si vous souhaitez utiliser l'ESM natif, vous devez définir les éléments suivants "type": "module" dans le fichier package.json et le nom du fichier doit inclure .js extension, c'est-à-dire file.js . Dans le cas contraire, ne pas spécifier "type" (ou spécifier " type": "commonjs" ) et le nom du fichier peut être accompagné ou non de la mention .js extension. Pour ESM dans ce cas, vous devez avoir l'extension ".mjs".

2voto

Raunak Points 43

J'ai résolu le problème en ajoutant une extension .js à mon fichier WWW. Je ne sais pas trop pourquoi il faut une extension pour Node 13.9 et plus alors que cela fonctionnait parfaitement pour 13.8.

2voto

Andrea Di Cioccio Points 322

Ok j'écris la solution ici si vous avez réussi, en plus je vous dis aussi les raisons de l'erreur. WWW a besoin d'une extension, comme .js (WWW.js). C'est parce que get_format.js essaye de récupérer le type d'extension, c'est écrit dans l'erreur générée dans la console.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X