在浏览器中使用 node.js 的文件系统功能

IT技术 javascript node.js
2021-03-05 07:42:52

我想创建一个从服务器中删除文件的函数。我打算使用此功能将设置(即 db 文件)恢复到默认状态。我使用以下命令运行我的服务器:

node server.js

我知道 node.js 的文件系统,但我不知道如何在浏览器端使用它。我对这个问题做了一些简单的阅读,在我看来,由于安全原因,这种交互是不可能的。我该怎么做?

3个回答

您不能fs在浏览器中使用 Node并让它直接影响服务器上的文件系统。fs仅用于本地可用的文件系统。您将需要创建一个 API 或使用其他一些技术。

有一些 API 模拟fs浏览器,例如filer.
2021-05-18 07:42:52

正如其他答案所说,直接从客户端调用节点服务器的方法是不可能的,但是您可以通过从浏览器发送请求来间接实现。在 Node.JS 部分,您可以创建一个 http 服务器,客户端会调用它,然后服务器可以执行操作。

但是您应该记住,以这种方式删除文件可能很危险,您需要确保在服务器端,您只允许删除您真正想要删除的内容。例如,您可能只允许从特定目录中删除文件(而不仅仅是任何文件!)。

确实有多种方法可以做到。您可以在纯节点(http.Server类)中完成它,或者您可以使用一些额外的module,例如express(它可以帮助您使用几行代码创建一个 http 服务器)或jxm(它可以帮助您创建客户端-服务器消息传递系统 - 也只有几行代码)。

由于对jxm比较熟悉,我给大家做了一个简单的例子:

服务器.js

var server = require('jxm');
var fs = require("fs");

server.setApplication("Hello World", "/", "STANDARD-KEY");
server.linkResource("/", ["./index.html", "text/html"]);

server.addJSMethod("removeFile", function (env, param) {;
  if (fs.existsSync(param)) {
    fs.unlinkSync(param);
    server.sendCallBack(env, "File Deleted: " + param);
  } else {
    server.sendCallBack(env, "File does not exist: " + param);
  }
});

server.start();

索引.html

<!DOCTYPE html>
<html>
<head>
    <script src="/jx?ms=connect" type="text/javascript"></script>
</head>
<input type="button" id="btnRemove" value="Remove temp.txt file" disabled="disabled"/>
<script type="text/javascript">

    document.onjxready = function () {
        jxcore.Start(function (status) {
            var btn = document.getElementById('btnRemove');
            btn.disabled = "";
            btn.onclick = function () {
                jxcore.Call("removeFile", "temp.txt", function (ret) {
                    alert(ret);
                });
            };
        });
    };
</script>
</body>
</html>

下面是如何运行它。只需安装一次 jxm module:

$ npm install jxm

现在您可以启动服务器:

$ node server.js

之后,您可以转到浏览器(http://localhost:8000/)并单击按钮。

尽管 jxm 与JXcore一起工作得最好(他们都来自同一个团队),但它也可以与 Node.JS 一起工作(如上例所示)。

感谢所有的回答和评论。他们帮助我指明了正确的方向。我真正想要的是从客户端进行简单的 API 调用。这是我使用 express 所做的:

var app = express();
var settingsapirouter = require('./../../settings/settingsapi');
app.use('/api/settings', settingsapirouter);

在 中settingsapi,我定义:

module.exports = function (...) 
{
    var router = express.Router();

    router.route('/restoredb')
        .post(function (request, response) {
              ...
              });
}

在客户端的 JS 中:

function restoreSettings()
{
    $.ajax({
        url: '/api/settings/restoredb',
        type: 'POST',
    })
    .done(function() {
        console.log("success");
    }); 
}