Javascript JS中的承诺:使用Axios写入mongoDB

Javascript JS中的承诺:使用Axios写入mongoDB,javascript,mongodb,promise,axios,Javascript,Mongodb,Promise,Axios,我正努力使我的头绕过承诺。我想我理解这个概念,但我无法让他们在后端工作 我读过好几篇文章。我仍然看到一些只有几个月大的,所以我想我不是唯一一个:) 具体来说,我需要关于如何在代码中传递已解决承诺的结果的帮助。在下面的代码中,我从starwars api获取了一个JSON文件,并希望将其写入mongodb atlas集合 我使用axios.get,它返回一个承诺。然后在mongoDB集合上使用insertOne来解析它 在前端,例如在React中,它按预期工作,您可以使用setState通过使用.

我正努力使我的头绕过承诺。我想我理解这个概念,但我无法让他们在后端工作

我读过好几篇文章。我仍然看到一些只有几个月大的,所以我想我不是唯一一个:)

具体来说,我需要关于如何在代码中传递已解决承诺的结果的帮助。在下面的代码中,我从starwars api获取了一个JSON文件,并希望将其写入mongodb atlas集合

我使用axios.get,它返回一个承诺。然后在mongoDB集合上使用insertOne来解析它

在前端,例如在React中,它按预期工作,您可以使用setState通过使用.then函数中的setState来更改状态。 我不明白为什么它在后端不工作

你能告诉我我需要修改什么,这样我才能把它写到mongoDB atlas上吗

var axios = require("axios");
const MongoClient = require("mongodb").MongoClient;
var db;

const getData = () => {
  return axios
    .get("https://swapi.co/api/people/1")
    .then(response => {
      if (!response.data) throw Error("No data found.");
         console.log(JSON.stringify(response.data))  **//This returns the data as expected.**
         return JSON.stringify(response.data);
    })
    .catch(error => {
      console.log(error);
      throw error;
    });
};

console.log(getData()); **// This returns {Promise <pending>}**


const client = new MongoClient(process.env.MONGODB_URL, {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// Connect to database and insert default users into users collection
client.connect(err => {

  console.log("Connected successfully to database");

  let d = {
    name: "Luke Skywalker",
    height: "172",
    mass: "77",
    hair_color: "blond",
    skin_color: "fair",
    eye_color: "blue"
  };



  db = client.db(process.env.DB_NAME);
  db.collection("macroData").insertOne(d);  //this works
  db.collection("macroData").insertOne(getData); // this doesn't work as it still appears to  be a promise
});
var-axios=require(“axios”);
const MongoClient=require(“mongodb”)。MongoClient;
var-db;
常量getData=()=>{
返回轴
.get(“https://swapi.co/api/people/1")
。然后(响应=>{
如果(!response.data)抛出错误(“找不到数据”);
console.log(JSON.stringify(response.data))**//这将按预期返回数据**
返回JSON.stringify(response.data);
})
.catch(错误=>{
console.log(错误);
投掷误差;
});
};
console.log(getData());**/这返回{Promise}**
const client=new MongoClient(process.env.MONGODB_URL{
useNewUrlParser:true,
useUnifiedTopology:正确
});
//连接到数据库并将默认用户插入用户集合
client.connect(err=>{
log(“已成功连接到数据库”);
设d={
姓名:“卢克·天行者”,
身高:“172”,
弥撒:“77”,
头发颜色:“金色”,
肤色:“白皙”,
眼睛颜色:“蓝色”
};
db=client.db(process.env.db_NAME);
db.collection(“macroData”).insertOne(d);//这很有效
db.collection(“macroData”).insertOne(getData);//这不起作用,因为它似乎仍然是一个承诺
});
getData()
返回一个承诺,正如您所知,因此您必须等待该承诺得到解决。一种简单的方法是在数据可用后执行插入:

client.connect(err=>{
// ...
getData()。然后(数据=>{
db.collection('macroData').insertOne(数据)
})
})
或者,如果可以使用异步/等待:

client.connect(异步错误=>{
// ...
常量数据=等待获取数据()
db.collection('macroData').insertOne(数据)
})

您的mongodb调用需要在axios承诺的范围内,这样就可以使用已解析的承诺为您的数据库提供数据。这就是让我耽搁了一段时间的原因

下面的代码是为Nick comment编写的,我无法在评论中发布代码,因为它太长了。您应该在这里有一个名为test的数据库或适当的名称
let-datab=client.db('test')
,我认为在创建mongodb atlas时,它是默认的。 如果您在mongourl中更改了您的用户和密码,您应该可以开始了。 希望有帮助。这将在test.starWarsData下创建一个starwars条目。。希望t

let axios = require("axios");
let MongoClient = require("mongodb").MongoClient;
let mongoParams = { useNewUrlParser: true, useUnifiedTopology: true };

let mongoUrl =
  "mongodb+srv://user:password@cluster0-hnc4i.azure.mongodb.net/test";
//try feeding just the object e, and see if it works, in case your axios error catching is not great.
let e = {
  a: "this is a",
  b: "this is b",
  c: "this is c",
  d: "this is d"
};

let newUrl = "https://swapi.co/api/people/1";

console.log(newUrl);

let client = new MongoClient(mongoUrl, mongoParams);

client.connect(err => {
  if (err) {
    console.log(err.message);
    throw new Error("failed to connect");
  }

  let datab = client.db("test");
  console.log("db connected");

  try {
    axios.get(newUrl).then(res => {
      try {
        datab.collection("starWarsData").insertOne(res.data);
        console.log("insert succeeded");
      } catch (err) {
        console.log("insert failed");
        console.log(err.message);
      }
    });
  } catch (err) {
    throw Error("axios get did not work");
  }
});

工作!添加了一些try catch以查找错误,因为这使我更容易找出问题所在。更新的代码在这里<代码>获取数据(url).然后(数据=>{try{db.collection(“macroData”).insertOne(数据);console.log(“Insert-worked”);}catch{console.log(“Insert-failed”);}).catch(err=>Error(“something-breaked”)很高兴它为您解决了问题-为了简洁起见,我没有包括错误检查。显然,在插入和捕获潜在问题之前,您应该检查有效性。