Intentando alojar un servidor API de nodejs simple en el servicio de aplicaciones de Azure, pero aparece el siguiente error cuando Azure intenta implementarlo
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: D:\home\site\wwwroot\server.js require() of ES modules is not supported. require() of D:\home\site\wwwroot\server.js from D:\Program Files (x86)\iisnode\interceptor.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules. Instead rename server.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from D:\home\site\wwwroot\package.json.
Se verificó el servicio de aplicaciones de Azure, WEBSITE_NODE_DEFAULT_VERSION está configurado en ~14 y la versión de nodejs instalada es v14.15.0 en la aplicación web. No crea que esta versión del nodo ya tiene problemas con la importación y exportación.
El código funciona perfectamente bien localmente con cualquiera de
node server.js # or node --experimental-modules server
No estoy seguro de por qué está fallando en Azure
Mi código está a continuación:
servidor.js
import express from 'express'; import bodyParser from 'body-parser'; let app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); let port = process.env.PORT || 8080; let router = express.Router(); // Middleware to use for all requests router.use(function(req, res, next) { next(); }); router.get('/', function(req, res) { res.json({ message: 'Default home page for the api!' }); }); app.use('/api', router); // START THE SERVER // ============================================================================= app.listen(port); console.log(`Server up and running on port ${port}`);
paquete.json
{ "name": "my_package", "version": "1.0.0", "type": "module", "scripts": { "start": "node --experimental-modules server", "test": "mocha" }, "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1" } }
Sin embargo, si cambio la importación y exportación para requerir, entonces se ejecutará en la aplicación web de Azure, ¿parece que Azure IIsnode aún no es compatible con Emac6? ¿Alguien sabe?
¿Alguien tiene alguna solución para esto además de usar babel para transpilar emac6 a emac5? Como tengo algún problema con la ejecución y ejecución del código emac5 transpilado.
Gracias
Esto se puede resolver agregando un nuevo archivo junto a su server.js
y configurándolo como el punto de entrada del servicio de la aplicación (o más específicamente de iisnode) (vea su web.config
).
Llamemos al nuevo archivo run.cjs
y coloquemos solo la siguiente línea en él:
import("./server.js");
La extensión del archivo cjs
es importante porque le dice a Node que este archivo no es un módulo ES, como se esperaría debido a "type": "module"
en su package.json
. Esto permite que otros archivos CommonJS incluyan nuestro nuevo archivo, es decir, el interceptor.js
de iisnode. Vuelve a importar server.js
, que luego funciona bien como módulo ES.
Agregue "type": "module"
en el archivo package.json
. Funciona para mí.
{ "name": "module-error", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "start": "node --experimental-modules server", "test": "mocha" }, "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1" }, "author": "", "license": "ISC", "type": "module" }
Agregando a lo que dijo @sibbl
server.js
reemplácelo con run.cjs
¡Funciona! Gracias de nuevo @sibbl