繁体   English   中英

收到错误 TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension "" for D:\Projects\matri-site\bin\www for Node Js v14

[英]Getting error TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension "" for D:\Projects\matri-site\bin\www for Node Js v14

我是 Node js 的新手,遇到了一些问题。 以前我使用 node Js v13.8 来运行我的 express 应用程序,它运行得很好。 我使用的是具有 JS 扩展文件的 es6 语法和类型模块。 但是,当我升级到 Node 14.1.0. 它显示以下错误(与 13.9 相同的错误)。

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension "" for D:\Projects\matri-site\bin\www

这是我的错误片段

当我再次降级到 Node 13.8 时,它工作正常。

这是我的 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" } }

这是我的万维网文件:

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

真正的原因在于 ESM 支持的新规范。 也就是说,包含#!/usr/bin/env node的文件在"type": "module"时需要扩展名。 本机 ESM 需要.js扩展名来识别它是否是 ESM(如果您的代码实际上是用 commonjs 编写的,则需要指定 .cjs 扩展名),这就是它抱怨TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ""的原因

也就是说,如果你想使用原生 ESM,你将在 package.json 中定义"type": "module"并且文件名必须包含.js扩展名,即file.js 否则,不要指定“type”(或指定“ type": "commonjs" ),文件名可以带或不带.js扩展名。 对于这种情况下的 ESM,您将需要具有“.mjs”扩展名。

我通过为我的 WWW 文件提供 .js 扩展名解决了这个问题。 我不确定为什么它需要 Node 13.9 及更高版本的扩展,而它在 13.8 上运行完美。

好的,如果你成功了,我在这里写解决方案,另外我也告诉你错误的原因。 WWW 需要一个扩展,比如.js (WWW.js)。 这是因为get_format.js试图获取exetension的类型,都写在控制台产生的错误中。

这是我使用的解决方法:

index.js

import { NeuralNetwork } from './brain.cjs'

大脑.cjs

module.exports = require('brain.js')

在我的例子brain.js没有包含对其主文件的扩展名,因此节点无法使用 ESM 加载它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM