一尘不染

onload js调用不适用于节点

node.js

我开始学习node.js,现在我只是想用node执行我的旧无节点应用程序。在这个应用程序中,我有一个html页面,其中的正文调用了onload
js函数。工作正常。

现在我有一个节点应用程序:app.js,很简单:

var express = require ('express');
var app = express ();
app.use(express.static(__dirname + '/images'));
app.use(express.static(__dirname + '/CSS'));
app.use(express.static(__dirname + '/font'));
app.use(express.static(__dirname ));
app.use(express.static(__dirname +'/ketcher'));
app.use(express.static(__dirname +'/ChemAlive_JS'));
app.get('/', function(req, res) {

    res.sendFile('/home/laetitia/Project/ChemAlive_Interface_Node/ChemAlive_Interface.html');
});

app.listen(8080);

在.html中,我仍然有:

<body onload="ketcher.init();">

但我要加载的功能不再加载。

有什么线索吗?

谢谢


阅读 237

收藏
2020-07-07

共1个答案

一尘不染

您没有在问题中提供很多信息,但是根据您提供的信息,我几乎没有什么建议:

意见建议

而不是增加很多express.static用途:

app.use(express.static(__dirname + '/images'));
app.use(express.static(__dirname + '/CSS'));
app.use(express.static(__dirname + '/font'));
app.use(express.static(__dirname ));
app.use(express.static(__dirname +'/ketcher'));
app.use(express.static(__dirname +'/ChemAlive_JS'));

将您要提供的文件(和目录)放入一个目录(例如)static,并使用express.static一次:

app.use(express.static(__dirname + '/static'));

或更妙的是,使用path模块:

app.use(express.static(path.join(__dirname, 'static')));

您首先需要使用以下path模块:

var path = require('path');

现在,不要通过以下方式为'/'路由提供单个文件:

app.get('/', function(req, res) {
    res.sendFile('/home/laetitia/Project/ChemAlive_Interface_Node/ChemAlive_Interface.html');
});

只需将该文件static作为index.html 放入目录中,即可由express.static中间件自动提供。

基本原理

当前配置它的方式是,例如,每个人都可以下载您的Node应用程序- app.js包括其所有配置甚至子模块等。

另外,通过express.static多次使用中间件,我怀疑您不确定这些目录中的文件将如何映射到URL。

将静态文件放在一个位置可以轻松地验证任何脚本标签是否具有正确的路径等。

我猜

您没有提供足够的信息来确保确定,但是我的猜测是主H​​TML文件的JavaScript文件未正确加载,但是您没有提供足够的信息来确定。

您可以在浏览器中打开开发人员工具控制台,并在控制台打开时重新加载页面,查看是否有错误。

我怀疑该ketcher.init()方法正在运行,但是该方法或ketcher对象未定义,因为某些<script>标签无法加载。

遵循我的建议后的完整示例将更加简单:

var path = require('path');
var express = require ('express');
var app = express();
app.use(express.static(path.join(__dirname, 'static')));
app.listen(8080);

也许我会添加一些输出以查看发生了什么:

var path = require('path');
var express = require ('express');
console.log('starting app.js');
var app = express();
app.use(express.static(path.join(__dirname, 'static')));
app.listen(8080, function () {
    console.log('listening on http://localhost:8080/');
});

现在,您可以将所有可提供给浏览器的文件放在一个位置:static在本示例中的目录中。

工作应用

您可以在GitHub上看到我的工作正常的Express应用程序示例,该示例提供静态文件:

在此示例中,将调用静态文件的目录,html但是您可以根据需要调用它,只要它与您使用express.static中间件的方式一致即可。

您可以从此示例项目开始,然后将自己的文件放入express.static被告知查找要提供文件的目录中。

您还可以更改端口号以满足您的需求。

有和没有Express的情况下都有更多示例可做,另外还有更好的解释:

更多提示

如果页面正在等待加载某些资源,则可能不会触发onload回调。

要查看是否触发了onload回调,可以将其更改为:

<body onload="alert('onload callback fired');">

此外,ketcher对象可能未初始化或没有init()方法。加载页面后,您可以打开JavaScript控制台并尝试手动运行该方法,以查看如果被触发该方法是否可以工作:

ketcher.init();

您也可以尝试以下命令:

console.dir(ketcher.init);
console.dir(ketcher);
console.log(typeof ketcher.init);
console.log(typeof ketcher);

查看ketcher对象是否包含应包含的内容。

即使GET localhost:8080/ketcher.js状态为200
OK,它仍然可以加载一些其他不可用的资源,或者res.sendFile()(使用这种情况下提供文件的代码很常见)(虽然在这种情况下不太可能),但是它可以提供HTML而不是JavaScript并导致<字符上的神秘解析错误-

2020-07-07