为什么我的回调函数不能正确工作?

3
这种方法在Node服务器上运行。
const express = require("express");
const app = express();

const fs = require("fs");
const connectDb = require("./config/db");

const __init__ = (local = false) => {
  fs.writeFile(
    "./config/default.json",
    `{
        "mongoURI": ${
          local
            ? `"mongodb://127.0.0.1:27017/test"`
            : `"mongodb+srv://admin:<password>@abc-xxghh.mongodb.net/test?retryWrites=true&w=majority"`
        }
      }`,

    function(err) {
      if (err) {
        return console.log(err);
      }

      connectDb();
    }
  );
};

__init__(true);

问题在于如果原来的mongoURI: 127.0.0.1:27017,并且我执行__init__(false),则Node将尝试连接到127.0.0.1:27017,但实际上应该连接到+srv URI。
如果我再次运行__init__(false),那么它将连接到适当的链接。
同样,如果我运行__init__(true),它将连接到srv+而不是本地,如果我再次运行__init__(true),那么它才会连接到本地。
我在这里做错了什么?我按照规定使用回调函数,不是吗?
编辑:
//config/db
// for mongoDB connection
const mongoose = require("mongoose");
// require the directory
const config = require("config");
// get all contents of JSON file
const db = config.get("mongoURI");

const connectDb = async () => {
  try {
    console.log("connecting to mongodb", db);
    await mongoose.connect(db, {
      useNewUrlParser: true,
      useCreateIndex: true,
      useFindAndModify: false,
      useUnifiedTopology: true
    });

    console.log("Mongo DB connected");
  } catch (err) {
    console.log("unable to connect to mongodb");
    console.log(err.message);
    //exit if failure
    process.exit(1);
  }
};

module.exports = connectDb;

我甚至尝试了以下操作:

.....
  console.log("Developing locally:", local);

  // require the directory
  const config = require("config");
  // get all contents of JSON file
  const db = config.get("mongoURI");
  connectDb(db);
.....

但它仍然读取旧值。

节点版本和操作系统是什么? - Manuel Spigolon
你能否也添加 ./config/db。我认为这是在启动时执行 require,所以在写入文件之前读取它。 - Manuel Spigolon
节点v12.10.0,MacOS Mojave - Mike K
@ManuelSpigolon 已添加。 - Mike K
2个回答

1
问题在于执行顺序,因为require是同步的。

现在的顺序是:

  1. const connectDb = require("./config/db");
  2. const config = require("config");
  3. const db = config.get("mongoURI");// 这里有旧值
  4. fs.writeFile(...
  5. await mongoose.connect(db, {// 这里使用了旧的引用

所以你需要像这样更改你的connectDb函数:

const connectDb = async () => {
  const config = require("config");
  // get all contents of JSON file
  const db = config.get("mongoURI");

  try {
    console.log("connecting to mongodb", db);
    await mongoose.connect(db, {
      useNewUrlParser: true,
      useCreateIndex: true,
      useFindAndModify: false,
      useUnifiedTopology: true
    });

    console.log("Mongo DB connected");
  } catch (err) {
    console.log("unable to connect to mongodb");
    console.log(err.message);
    //exit if failure
    process.exit(1);
  }
};

无论如何,我认为这不是一种更好的根据环境加载配置文件的方式,因此我建议使用工厂模式进行改进。

这个不起作用,我已经尝试重新定位 const db = config.get("mongoURI");。出于某种原因,它仍然具有旧值。我有一种感觉,在需要 connectDb 时加载旧值,而不管何时调用 connectDb - Mike K
我将require("config")函数移入了代码中,这样就可以加载文件了。 - Manuel Spigolon
你能再试一次吗?查看代码 config 模块正在使用 require 函数同步加载 default.json - Manuel Spigolon

0

你的URL本地与srv+的代码是正确的。我看到的问题是connectDb()方法的放置位置。

fs.writeFile("fir arg - URL", "second -content", third - error fun {});

在你的代码中,函数connectDb()应该放在error fun之后。在它之后应该关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接