【问题标题】:Write mongo shell script in TS file在 TS 文件中编写 mongo shell 脚本
【发布时间】:2021-04-13 19:58:32
【问题描述】:

我有一个mongo-init.js,它会在应用启动时创建一些测试数据:

// Create admin user for reading and writing data from server
db.createUser({
  user: "admin",
  pwd: "password",
  roles: [
    {
      role: "readWrite",
      db: "authStarterDB",
    },
  ],
});

// Create testing data
// User - email: test@gmail.com, username: test, psw: qweqweqwe
let res = [
  db.users.drop(),
  db.users.createIndex({ email: 1 }, { unique: true }),
  db.users.createIndex({ username: 1 }, { unique: true }),
  db.users.insert({
    email: "test@gmail.com",
    username: "test",
    salt: "62a633a7a64abd1909c69aa78259cff1258dd335c8c7a453de09e6801cd46b36",
    hash:
      "fc3042f428d75d266d8cf799536a2d7ed743d0cdab5bb086ad9379caa3f6d136bdcef3e746c4591272886e62e64fd2e6205c3479d257d06bc28f476919e6c6c0d7ee3a91f74eda3b851862baa51c45a666f295993e96e3c98c614af59a80d0857d735d7dd31070e36901309efe25fb81b363684d830545cb75d4787f045da82d10f308332fc0d7bf1b85c0ae5c601025e64f437947dc92ac319c294fb92e38106261ba47d004105afab6ad5a2af3d582a8897dc180ff97cedb775bc90082207387de92a18da293f4831e6efd89277fe128df9d0889c8e16b3e56c7b00bb66805108e7a7996d43b2754c8dcf8540347a67ffee4f8a866311afcfb59efa9c4c35fcd3f089e69fb04e77a2b11a49d904271b890e0e785902ebf11d620cbc7845f1762bc71df7163220e293b122cd6a35ce9d1359057cedb3da8c55bd29fab0261e2886bbf9d7f11d5782a5377be0c5e01b8bf3fe69cb0895d23f5604d08e5d4d09669f4448a1d102696ac053e77d0d413922cda7e4e51d71e606441ffea1bcb1dbe7d777a48548ec2df42a3c8d076f599919cd359fe622ba9a2193d38bb1e13dc2db1827c0ba20e52be3210778bb4fec8a7ae0b7f385a23aeac2592091f645146dc4ebea20efba6ed921871b1dae8841b07670762aa0312156fe02bb7b68ec06b34a7bca1ee4d2276483915eb753580afc20467abccbea9c506c118f290756c5fe7",
    createdAt: ISODate("2020-01-01T00:00:00.174Z"),
    updatedAt: ISODate("2020-01-01T00:00:00.174Z"),
  }),
];
printjson(res);

我已将整个应用程序转换为使用 Typescript,但我不确定如何使用此文件,因为它不是真正的 javascript。

从编译器我得到Cannot find name ''.ts(2304) 对应'db''ISODate''printjson'

我认为这也许可以转换为 .sh 脚本,但环顾四周我遇到了 this q/a 建议直接在 js 文件上编写 mongodb 脚本。

那么有没有办法为 mongodb 命令声明类型?否则如何解决?

【问题讨论】:

  • 将 js 转换为 typescript 本质上是向所有内容添加类型定义,无论如何编译后都会生成一个 js 文件,这些错误表明您没有使用 mongodb types npm 包:@types/mongodb,以及因为不在范围内工作。要删除类型错误(禁用编译器类型检查),您可以将变量声明为 any 类型 - 但这会让您想知道为什么首先在这种情况下使用 typescript

标签: mongodb typescript


【解决方案1】:

您应该使用mongodb driver 来执行mongo 脚本。此外,由于您使用的是打字稿,您还应该安装mongo types。阅读有关 mongodb nodejs 驱动程序的文档。它真的很容易使用。
javascript 中也不存在 printjosnISODate 等函数。

  1. 您应该使用new Date("2020-01-01T00:00:00.174Z") 而不是ISODate("2020-01-01T00:00:00.174Z")
  2. 而不是printjson(res) 使用以太console.log(res)console.log(JSON.stringify(res, null, 2))

【讨论】:

    【解决方案2】:

    您不能在此文件中使用 Typescript,因为您使用不支持 Typescript 的 mongo shell 运行它。

    如果你想在这个文件中使用 Typescript,你必须用 tsc 编译它,然后在 mongo shell 中运行生成的 JS 文件。

    这会很棘手,因为我找不到任何现成的类型定义,例如 db.createUserprintjson,这意味着您必须自己定义这些类型,而不是理想的 IMO。

    根据 Serhiy Mamedov 的建议,您可以改用 npm 中的 mongodb 包和适当的 types from DT 以实现 create new userdrop collection 等。

    本质上,我建议你将脚本从 mongo shell 环境重写为 NodeJS 环境,在那里你将有现成的质量类型定义。

    正如您在this question 中看到的那样,OP 试图在 NodeJS 环境中使用 mongo shell 环境中的createUser() 函数,但失败了。因为在 NodeJS 环境中,同样的函数被称为addUser()

    【讨论】:

      【解决方案3】:

      如果您希望在 mongo shell 中执行上述命令,那么您可能拥有包含以下内容的 javascript 文件:

      var createUserResult = db.createUser({
          user: "admin",
          pwd: "password",
          roles: [
              {
                  role: "readWrite",
                  db: "authStarterDB",
              },
          ],
      });
      print("createUserResult:", JSON.stringify(createUserResult));
      
      // Create testing data
      // User - email: test@gmail.com, username: test, psw: qweqweqwe
      //
      var dropUserResult = db.users.drop();
      print('dropUserResult:', JSON.stringify(dropUserResult));
      
      var emailIndexResult = db.users.createIndex({ email: 1 }, { unique: true });
      print('emailIndexResult:', JSON.stringify(emailIndexResult));
      var usernameIndexResult = db.users.createIndex({ username: 1 }, { unique: true });
      print('usernameIndexResult:', JSON.stringify(usernameIndexResult));
      var userInsertResult = db.users.insert({
          email: "test@gmail.com",
          username: "test",
          salt: "62a633a7a64abd1909c69aa78259cff1258dd335c8c7a453de09e6801cd46b36",
          hash:
              "fc3042f428d75d266d8cf799536a2d7ed743d0cdab5bb086ad9379caa3f6d136bdcef3e746c4591272886e62e64fd2e6205c3479d257d06bc28f476919e6c6c0d7ee3a91f74eda3b851862baa51c45a666f295993e96e3c98c614af59a80d0857d735d7dd31070e36901309efe25fb81b363684d830545cb75d4787f045da82d10f308332fc0d7bf1b85c0ae5c601025e64f437947dc92ac319c294fb92e38106261ba47d004105afab6ad5a2af3d582a8897dc180ff97cedb775bc90082207387de92a18da293f4831e6efd89277fe128df9d0889c8e16b3e56c7b00bb66805108e7a7996d43b2754c8dcf8540347a67ffee4f8a866311afcfb59efa9c4c35fcd3f089e69fb04e77a2b11a49d904271b890e0e785902ebf11d620cbc7845f1762bc71df7163220e293b122cd6a35ce9d1359057cedb3da8c55bd29fab0261e2886bbf9d7f11d5782a5377be0c5e01b8bf3fe69cb0895d23f5604d08e5d4d09669f4448a1d102696ac053e77d0d413922cda7e4e51d71e606441ffea1bcb1dbe7d777a48548ec2df42a3c8d076f599919cd359fe622ba9a2193d38bb1e13dc2db1827c0ba20e52be3210778bb4fec8a7ae0b7f385a23aeac2592091f645146dc4ebea20efba6ed921871b1dae8841b07670762aa0312156fe02bb7b68ec06b34a7bca1ee4d2276483915eb753580afc20467abccbea9c506c118f290756c5fe7",
          createdAt: ISODate("2020-01-01T00:00:00.174Z"),
          updatedAt: ISODate("2020-01-01T00:00:00.174Z"),
      });
      
      print("userInsertResult:", JSON.stringify(userInsertResult));
      

      然后你可以使用 load 命令来执行像 load('script.js') 这样的脚本

      希望这会有所帮助,如果仍在寻找其他东西,请告诉我,我会尝试看看我是否可以提供帮助!

      【讨论】:

      • 我在问题中编写的代码工作得很好,不需要重构 - 正如所提出的,我只是在寻找一种将上述文件转换为打字稿的方法
      • 好的,你觉得medium.com/swlh/using-typescript-with-mongodb-393caf7adfef这个博客对你有帮助吗?
      • 没有,请仔细阅读问题以了解我在寻找什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2021-08-05
      • 2011-06-24
      • 1970-01-01
      • 2022-11-12
      相关资源
      最近更新 更多