0

我目前正在尝试在我的(Firebase)nodejs 项目中导入和使用 nanoid。我安装了它

npm i nanoid

我试着用

import { nanoid } from 'nanoid'

import { nanoid } from '../node_modules/nanoid/nanoid.js'

我尝试的一切都失败了。我是 nodejs 和 js 本身的完整初学者,但没有网站或文档帮助我解决问题。我只想要一个唯一的 id :(

这是我的 index.html (减少到最低限度:

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to Firebase Hosting</title>

    !!!Here are Firebase imports!!!
 
    <script defer src="/__/firebase/init.js?useEmulator=true"></script>
    <link rel="stylesheet" href="style.css">


  </head>
  <body>

    <div class="registerContainer">

    <div class="registerContent">
    <h1 id="title">Sign up</h1>
    <iframe name="hiddenFrame" width="0" height="0" border="0" style="display: none;"></iframe>
    <form id="form" onsubmit="return false">
    


      <!-- Birth date Input (required) -->
      <div class="input_field">
          <input id="date" onfocus="(this.type = 'date')" class="text_input" type="text" name="birthdate" placeholder="Geburtsdatum" required />
      </div>

      <!-- Checkbox 1 -->
      <div class="input_field checkbox_option">
          <input type="checkbox" id="cb1" class="checkbox">
          <label for="cb1">I agree with terms and conditions</label>
      </div>


      <input class="button" id="registerUser" type="submit" value="Anmelden"/>

    </form>
  </div>
    </div>

    <script src="app.js"></script>

  </body>
</html>

应用程序.js:

const nanoid = require('nanoid');

document.addEventListener('DOMContentLoaded', event => {
    const app = firebase.app();
    const db = firebase.firestore();

    const users = db.collection('users');
})


async function addUser() {
    console.log('adding User');
    const db = firebase.firestore();
    const users = db.collection('users');   
    const data = {
        email: document.getElementById("email").value,
        test_active: false
    };

    
    code = nanoid(10).toString();
    await users.doc(code).set(data);  
}
4

4 回答 4

0

我正在使用这个 nanoid,让我分享一下我的 POC,

import {nanoid} from 'nanoid';
const id = nanoid(length).toString();
于 2022-01-26T15:25:23.863 回答
0

我正在使用 nanoid 2.1.9 版

const nanoid = require('nanoid')
let id = nanoid(5)
于 2022-01-26T15:59:57.353 回答
0

尝试在需要它之前添加圆括号{ nanoid },然后声明一个名为ID存储它的变量:

var { nanoid } = require('nanoid');

var ID = nanoid();

于 2022-01-26T16:35:20.430 回答
0

根据您现有的评论,您似乎正在浏览器中运行此代码,并且您的项目中也没有 browserify 或任何其他捆绑程序。

该结论来自您评论说您收到错误的事实

要求未定义

require是特定于服务器端 NodeJS 项目的功能,在浏览器中不存在。如果你想使用 require 函数,你需要使用像 browserify 或 webpack 这样的打包工具,它会从你的 node_modules 文件夹中获取相关的包并将它们打包在一起供你的前端使用。

你得到的原因

应为 JavaScript 模块脚本,但服务器以“text/html”的 MIME 类型响应。根据 HTML 规范对模块脚本强制执行严格的 MIME 类型检查。

错误是因为当您要求 javascript 运行以下内容时:

import {nanoid} from 'nanoid';

浏览器认为包含当前页面的目录也有一个名为的文件nanoid,并且正在请求该文件。

请考虑以下情况:如果我的页面位于https://google.com并且我的代码import {nanoid} from 'nanoid'显示浏览器将发出请求,https://google.com/nanoid并且浏览器需要一个 javascript 文件,但它可能会收到错误 404 html 页面。

请记住,浏览器无权访问您的node_modules文件夹,除非它公开在您的网络服务器上,在这种情况下,您需要告诉它您尝试导入的文件的确切路径。

你能做什么?

您可以将 webpack 或 browserify 或其他一些捆绑器添加到您的项目中,但这可能需要一些工作,并且您提到您是初学者,所以我认为直接加入不是一个好主意。

另一种选择可能是将 nanoid 代码的浏览器版本直接添加到您自己的项目中。

我已经从 github https://github.com/ai/nanoid/blob/main/index.browser.js获取了代码的浏览器版本,并将其放入下面的脚本标签(摆脱 urlAlphabet 导入)您可以添加到您的代码中。请记住,此代码将全局添加nanoidcustomAlphabetcustomRandomurlAlphabetrandom变量,因此请确保与您的全局变量没有任何冲突。

<!-- Code for nanoid directly from the github with urlAlphabet import removed -->
<!-- https://github.com/ai/nanoid/blob/main/index.browser.js -->
<script>
let urlAlphabet =
  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))
let customRandom = (alphabet, size, getRandom) => {
  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
  let step = -~((1.6 * mask * size) / alphabet.length)
  return () => {
    let id = ''
    while (true) {
      let bytes = getRandom(step)
      let j = step
      while (j--) {
        id += alphabet[bytes[j] & mask] || ''
        if (id.length === size) return id
      }
    }
  }
}
let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random)
let nanoid = (size = 21) => {
  let id = ''
  let bytes = crypto.getRandomValues(new Uint8Array(size))
  while (size--) {
    let byte = bytes[size] & 63
    if (byte < 36) {
      // `0-9a-z`
      id += byte.toString(36)
    } else if (byte < 62) {
      // `A-Z`
      id += (byte - 26).toString(36).toUpperCase()
    } else if (byte < 63) {
      id += '_'
    } else {
      id += '-'
    }
  }
  return id
}
</script>

<p id="code"></p>

<!-- You can now use the nanoid() function in your javascript code -->
<script>
const id = nanoid();

document.getElementById("code").innerHTML = id;
</script>

于 2022-01-26T17:34:17.377 回答