【问题标题】:Express serve javascipt files if authorised如果授权,则快速提供 javascript 文件
【发布时间】:2020-09-07 23:52:44
【问题描述】:

在我的客户端javascript中,如果用户被授权(使用firebase auth),我会请求私有内容,如下所示:

firebase.auth().onAuthStateChanged(user => {
  if (!user) {
    ui.start("#firebaseui-auth-container", uiConfig);
  }
  if (user) {
    import("/private.js").then(module => {
      console.log(module.default);
    });
  }
});

从公共 Firebase 托管 URL 为所有用户提供 index.html,但只有当用户获得授权时,他们才会请求私有内容。我的firebase.json 重定向来处理这个:

 "rewrites": [
      {
        "source": "**",
        "function": "app"
      }
    ]

我正在努力建立一个基于 firebase 函数的快速后端来为 javascript 提供服务。 (我还没有添加身份验证检查,因为我想让它首先为 js 服务)。
我的 firebase 函数如下所示:

const fs = require("fs");
const functions = require("firebase-functions");
const express = require("express");
const app = express();

app.get("/private.js", (req, res) => {
  fs.readFile("private.js", "utf8", function (err, data) {
    if (err) throw err;
    res.send(data)
  });

});
exports.app = functions.https.onRequest(app);

但是,当用户获得授权并且客户端尝试动态导入 private.js 时,我收到以下错误:Failed to load module script: The server responded with a non-JavaScript MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec。如何正确设置 MIME 类型以提供 js 文件?

【问题讨论】:

    标签: javascript node.js firebase express firebase-authentication


    【解决方案1】:

    您需要告诉浏览器发生了错误,以便它不会尝试将响应解析为 JavaScript。您可以通过发送以 4(客户端错误)或 5(服务器错误)开头的状态代码来做到这一点。这是一个例子:

    app.get("/private.js", (req, res) => {
      fs.readFile("private.js", "utf8", function (err, data) {
        if (err) {
          res.status(403).send('Could not load the data.');
        } else {
          res.send(data);
        }
      });
    });
    

    【讨论】:

      【解决方案2】:

      我解决了。我需要使用:

       res.setHeader("Content-Type", "text/javascript"); //Solution!
          res.writeHead(200);
          res.end(data);
      

      而且效果很好。

      【讨论】:

      • 在访问private.js 时是否要发送非私有 JavaScript 文件并且出现错误?否则最好只发送一个没有 JavaScript 内容的错误。
      • 我会检查用户是否被授权(使用firebase admin sdk)然后返回js,否则返回错误。
      【解决方案3】:

      试试这个

      res.type('.js');
      res.send(data);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        相关资源
        最近更新 更多